web-push-notifications
Version:
Pushwoosh web push notifications
1 lines • 50.5 kB
JavaScript
!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var s=e();for(var a in s)("object"==typeof exports?exports:t)[a]=s[a]}}(this,()=>(()=>{"use strict";const t={d:(e,s)=>{if(Array.isArray(s))for(var a=0;a<s.length;){var i=s[a++],r=s[a++];t.o(e,i)?0===r&&a++:0===r?Object.defineProperty(e,i,{enumerable:!0,value:s[a++]}):Object.defineProperty(e,i,{enumerable:!0,get:r})}else for(var i in s)t.o(s,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:s[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}};let e={};t.r(e),t.d(e,{Pushwoosh:()=>ht});const s="/pushwoosh-service-worker.js",a="deviceRegistrationStatus",i="registered",r="unregistered",n="granted",o="default",c="onReady",u="onSubscribe",h="onUnsubscribe",d="onRegister",g="onPermissionPrompt",l="onPermissionDenied",p="onPermissionGranted",m="onSWInitError",w="onPushDelivery",b="onNotificationClick",v="onNotificationClose",y="onChangeCommunicationEnabled",f="onPutNewMessageToInboxStore",S="onUpdateInboxMessages",P="onShowNotificationPermissionDialog",C="onHideNotificationPermissionDialog",k="onShowSubscriptionWidget",D="onHideSubscriptionWidget",I="PW_SiteOpened",E={autoSubscribe:!0,serviceWorkerUrl:s};function x(){return globalThis}function M(){return crypto.randomUUID?.()||"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=16*Math.random()|0;return("x"===t?e:3&e|8).toString(16)})}const T=t=>"function"==typeof t,_={[d]:{name:"register"},[u]:{name:"subscribe"},[h]:{name:"unsubscribe"},[m]:{name:"initialize-service-worker-error",prop:"error"},[w]:{name:"receive-push",prop:"notification"},[b]:{name:"open-notification",prop:"notification"},[v]:{name:"hide-notification",prop:"notification"},[y]:{name:"change-enabled-communication",prop:"isEnabled"},[f]:{name:"receive-inbox-message",prop:"message"},[S]:{name:"update-inbox-messages",prop:"messages"},[P]:{name:"show-notification-permission-dialog"},[C]:{name:"hide-notification-permission-dialog",prop:"permission"},[k]:{name:"show-subscription-widget"},[D]:{name:"hide-subscription-widget"},[l]:{name:"permission-denied"},[g]:{name:"permission-default"},[p]:{name:"permission-granted"}},W="keyValue",A="messages",R="inboxMessages";function N(t,e){return function(s){s.objectStoreNames.contains(t)||e(s)}}const O=[N(W,function(t){t.createObjectStore(W,{keyPath:"key"})}),N("log",function(t){const e=t.createObjectStore("log",{keyPath:"id",autoIncrement:!0});e.createIndex("environment","environment",{unique:!1}),e.createIndex("date","date",{unique:!1}),e.createIndex("type","type",{unique:!1})}),N(A,function(t){t.createObjectStore(A,{keyPath:"id",autoIncrement:!0}).createIndex("date","date",{unique:!1})}),N(R,function(t){const e="status",s=t.createObjectStore(R,{keyPath:"inbox_id",autoIncrement:!1});s.createIndex(e,e,{unique:!1,multiEntry:!0}),s.createIndex("rt","rt",{unique:!1,multiEntry:!0})})];class L{get all(){return O}}class q{constructor(t,e=new L){this.db=t,this.migrationsBuilder=e}applyMigrations(){this.applyMigrationsPack(this.migrationsBuilder.all)}applyMigrationsPack(t){t.forEach(t=>{t(this.db)})}}function U(t,e){console.info("onversionchange",e),t.close()}let B;function F(){return B||(B=new Promise((t,e)=>{const s=indexedDB.open("PUSHWOOSH_SDK_STORE",7);s.onsuccess=s=>{const a=s.target.result;a.onversionchange=U.bind(null,a,e),t(a)},s.onerror=()=>e(s.error),s.onupgradeneeded=t=>{const s=t.target.result;s.onversionchange=U.bind(null,s,e);new q(s).applyMigrations()}})),B}function V(t){return F().then(e=>new Promise((s,a)=>t(e,s,a)))}class j{_add(t){return V((e,s,a)=>{const i=e.transaction([this.name],"readwrite").objectStore(this.name).add(t);i.onsuccess=()=>{s(t)},i.onerror=()=>{a(i.error)}}).then(t=>this.getAll().then(e=>{if(Array.isArray(e)){const s=e.map(t=>t.id).sort((t,e)=>t==e?0:t<e?1:-1);if(s.length>this.maxItems)return Promise.all(s.slice(this.maxItems).map(t=>this.delete(t))).then(()=>t)}return t}))}delete(t){return V((e,s,a)=>{const i=e.transaction([this.name],"readwrite").objectStore(this.name).delete(t);i.onsuccess=()=>{s(i.result)},i.onerror=()=>{a(i.error)}})}getAll(){return V((t,e,s)=>{const a=[],i=t.transaction(this.name).objectStore(this.name).openCursor();i.onsuccess=t=>{const s=t.target.result;s?(s.value&&a.push(s.value),s.continue()):e(a)},i.onerror=()=>{s(i.error)}})}}const $=(H=W,{get:(t,e)=>V((s,a,i)=>{const r=s.transaction(H).objectStore(H).get(t);let n,o=!1,c=!1;const u=()=>{clearTimeout(n),o?a(r.result?.value||e):c?i(r.error):n=setTimeout(u,0)};r.onsuccess=()=>o=!0,r.onerror=()=>c=!0,u()}),getAll:()=>V((t,e,s)=>{const a={},i=t.transaction(H).objectStore(H).openCursor();let r,n=!1,o=!1;const c=()=>{clearTimeout(r),n?e(a):o?s(i.error):r=setTimeout(c,0)};i.onsuccess=t=>{const e=t.target.result;e?(a[e.key]=e.value.value,e.continue()):n=!0},i.onerror=()=>o=!0,c()}),async extend(t,e){const s=await this.get(t),{...a}=e;await this.set(t,{...s,...a})},set:(t,e)=>V((s,a,i)=>{const r=s.transaction([H],"readwrite").objectStore(H).put({key:t,value:e});let n,o=!1,c=!1;const u=()=>{clearTimeout(n),o?a(t):c?i(r.error):n=setTimeout(u,0)};r.onsuccess=()=>o=!0,r.onerror=()=>c=!0,u()})});var H;const K=new class extends j{constructor(){super(...arguments),this.name="log",this.maxItems=100,this.environment="undefined"!=typeof self&&self.registration?"worker":"browser"}add(t,e,s){const a={type:t,environment:this.environment,message:`${e}`,date:new Date};return e instanceof Error&&(a.stack=e.stack),s&&(a.additional=s),this._add(a)}},z=new class extends j{constructor(){super(...arguments),this.name=A,this.maxItems=25}add(t){return this._add({...t,date:new Date})}},G={error:1,info:2,debug:3};let J=3;const Y={setLevel(t){G[t]||(t="error"),J=G[t]},write(t,e,s){return"error"===t?this.error(e):this.info(e),K.add(t,e,s)}};Object.keys(G).forEach(t=>{const e=G[t];Y[t]=(...s)=>{e<=J&&(console.groupCollapsed(t),console.info("",...s),console.trace("trace"),console.groupEnd())}});class Q{constructor(){this.addEventHandler=(t,e)=>{let s=this.handlers[t];s||(s=[]),s.push(e),this.handlers[t]=s},this.removeEventHandler=(t,e)=>{const s=this.handlers[t];s&&(this.handlers[t]=s.filter(t=>t!==e))},this.dispatchEvent=(t,e)=>{const s=e.eventId||M(),a=this.handlers[t];return a?(a.forEach(t=>{T(t)&&setTimeout(()=>{t({...e,eventId:s})},0)}),s):s},this.handlers={}}}class X{constructor(t=new Date){this._date=t}set date(t){this._date=t}get date(){return this._date}getUtcTimestamp(){return Math.floor((this.date.getTime()+60*this.date.getTimezoneOffset()*1e3)/1e3)}getTimestamp(){return Math.round(this.date.getTime()/1e3)}setLocal(){const t=this._date.getTime()-60*this.date.getTimezoneOffset()*1e3;this._date=new Date(t)}addDays(t){const e=this._date.getTime()+24*t*60*60*1e3;this._date=new Date(e)}getInboxFakeOrder(){return(100*this._date.getTime()+9e9).toString()}}class Z{constructor(t,e,s,a=new X){this.data=t,this.api=e,this.inboxModel=s,this.dateModule=a,this.publicMessageBuilder=this.publicMessageBuilder.bind(this)}messageTypeFactory(t,e){let s=0;return 2===t?s=1:"l"in e&&null!=e.l&&(s=e.l.startsWith("http")?2:3),s}async updateMessagesStatusWithCodes(t,e,s){const a=[],i=[];e.forEach(async e=>{-1!==t.indexOf(e.inbox_id)&&(e.status=s,a.push(e),i.push(this.api.inboxStatus(e.order,e.status)))}),await this.inboxModel.putBulkMessages(a),await Promise.all(i)}async publicMessageBuilder({action_type:t,action_params:e,image:s,title:a,send_date:i,inbox_id:r,text:n,status:o}){const c=s||await this.data.getDefaultNotificationImage(),u=a||await this.data.getDefaultNotificationTitle(),h=JSON.parse(e);return this.dateModule.date=new Date(1e3*parseInt(i)),this.dateModule.setLocal(),{title:u,imageUrl:c,code:r,message:n,sendDate:this.dateModule.date.toISOString(),type:this.messageTypeFactory(t,h),link:h?.l||"/",isRead:2===o||3===o,isActionPerformed:3===o}}messagesWithNoActionPerformedCount(){return this.inboxModel.getDeliveredReadMessagesCount()}unreadMessagesCount(){return this.inboxModel.getDeliveredMessagesCount()}messagesCount(){return this.inboxModel.messagesCount()}async loadMessages(){const t=[...await this.inboxModel.getReadOpenMessages(),...await this.inboxModel.getDeliveredMessages()].sort((t,e)=>parseInt(e.send_date,10)-parseInt(t.send_date,10)).sort((t,e)=>parseInt(e.order||"0",10)-parseInt(t.order||"0",10)).map(this.publicMessageBuilder);return Promise.all(t)}async readMessagesWithCodes(t){const e=await this.inboxModel.getDeliveredMessages();await this.updateMessagesStatusWithCodes(t,e,2)}async performActionForMessageWithCode(t){const e=await this.inboxModel.getMessage(t),s=JSON.parse(e.action_params),a=this.messageTypeFactory(e.action_type,s);2===a&&null!=s.l?document.location.href=s.l:3===a&&null!=s.l&&window.history.go(s.l),e.status=3,await this.inboxModel.putMessage(e),await this.api.inboxStatus(e.order,e.status)}async deleteMessagesWithCodes(t){const e=await this.inboxModel.getReadOpenMessages(),s=await this.inboxModel.getDeliveredMessages();await this.updateMessagesStatusWithCodes(t,[...e,...s],4)}async syncMessages(){await this.inboxModel.updateMessages()}}class tt{constructor(t,e){this.name=e,this.store=t.transaction(this.name,"readwrite").objectStore(this.name)}set index(t){this.store.indexNames.contains(t)?this._index=this.store.index(t):console.warn(`Index "${t}" in `)}writeRequestPromise(t,e){return new Promise((s,a)=>{t.onsuccess=()=>{s(e)},t.onerror=()=>{a(t.error)}})}readRequestPromise(t,e){return new Promise((s,a)=>{t.onsuccess=t=>{const a=t.target;s(a.result||e)},t.onerror=()=>{a(t.error)}})}put(t,e){const s=this.store.put(t,e);return this.writeRequestPromise(s,e)}add(t,e){return this.put(t,e)}delete(t){const e=this.store.delete(t);return this.writeRequestPromise(e)}get(t,e){const s=this.store.get(t);return this.readRequestPromise(s,e)}getAll(){const t=this.store.openCursor(),e=[];return new Promise((s,a)=>{t.onsuccess=t=>{const a=t.target.result;a?(e.push(a.value),a.continue()):s(e)},t.onerror=()=>{a(t.error)}})}count(t){const e=this.store.count(t);return this.readRequestPromise(e,0)}countByIndex(t){const e=this._index.count(t);return this.readRequestPromise(e,0)}}class et{getDB(){return F()}async put(t,e,s){const a=await this.getDB();return new tt(a,t).put(e,s)}async delete(t,e){const s=await this.getDB();return new tt(s,t).delete(e)}async get(t,e,s){const a=await this.getDB();return new tt(a,t).get(e,s)}async getAll(t){const e=await this.getDB(),s=new tt(e,t);return await s.getAll()||[]}async count(t,e){const s=await this.getDB();return new tt(s,t).count(e)}async countByIndex(t,e,s){const a=await this.getDB(),i=new tt(a,t);return i.index=e,i.countByIndex(s)}}class st{constructor(t,e,s,a=new et,i=new X){this.eventBus=t,this.data=e,this.api=s,this.storage=a,this.storeName="inboxMessages",this.dateModule=i}async getInboxMessages(){const t=await this.api.getInboxMessages();return await this.storeGetInboxMessagesRequestParams(t.next,t.new_inbox),t}async storeGetInboxMessagesRequestParams(t,e){this.dateModule.date=new Date,await this.data.setInboxLastRequestTime(this.dateModule.getUtcTimestamp()),await this.data.setInboxLastRequestCode(t),await this.data.setInboxNewMessagesCount(e)}async putServerMessages(t){const e=t.map(async t=>{const e=await this.storage.get(this.storeName,t.inbox_id,{});return"status"in e&&(t.status=e.status),this.putMessage(t)});return Promise.all(e)}putMessage(t){return this.storage.put(this.storeName,t)}putBulkMessages(t){const e=t.map(t=>this.putMessage(t));return Promise.all(e)}deleteMessages(t){const e=t.map(t=>this.storage.delete(this.storeName,t));return Promise.all(e)}async deleteExpiredMessages(){this.dateModule.date=new Date;const t=this.dateModule.getTimestamp().toString(),e=(await this.storage.getAll(this.storeName)).filter(e=>e.rt<t).map(t=>t.inbox_id);return this.deleteMessages(e)}getMessage(t){return this.storage.get(this.storeName,t)}async getReadOpenMessages(){return(await this.storage.getAll(this.storeName)).filter(t=>2===t.status||3===t.status)}async getDeliveredMessages(){return(await this.storage.getAll(this.storeName)).filter(t=>1===t.status)}async messagesCount(){return this.storage.count(this.storeName)}async getDeliveredMessagesCount(){return this.storage.countByIndex(this.storeName,"status",1)}async getReadMessagesCount(){return this.storage.countByIndex(this.storeName,"status",2)}async getDeliveredReadMessagesCount(){const[t,e]=[2,3],s=IDBKeyRange.bound(t,e);return this.storage.countByIndex(this.storeName,"status",s)}async updateMessages(){const t=await this.getInboxMessages();await this.deleteExpiredMessages(),t.deleted&&await this.deleteMessages(t.deleted),await this.putServerMessages(t.messages),this.eventBus.dispatchEvent("update-inbox-messages",{messages:new Z(this.data,this.api,this)})}}const at=t=>`params.${t}`;class it{constructor(t=$){this.store=t}async clearAll(){const t=["applicationCode","apiToken","hwid","deviceType","deviceModel","language","languageWasChanged","apiEntrypoint","tokens","applicationServerKey","isVapidChanged","webSitePushId","defaultNotificationImage","defaultNotificationTitle","userId","userIdWasChanged","email","emailWasChanged","isLastPermissionStatus","isManualUnsubscribed","isCommunicationDisabled","communicationEnabled","isDropAllData","sdkVersion","serviceWorkerVersion","serviceWorkerUrl","serviceWorkerScope","lastOpenMessage","lastOpenApplicationTime","features","init","inbox.lastRequestCode","inbox.lastRequestTime","inbox.newMessagesCount","delayedEvent","promptDisplayCount","promptLastSeenTime","logLevel","shownWebPopups","isRecurringVisitor"];for(const e of t)await this.store.set(at(e),void 0)}async setApplicationCode(t){await this.store.set(at("applicationCode"),t)}async getApplicationCode(){return this.store.get(at("applicationCode"))}async setApiToken(t){return await this.store.set(at("apiToken"),t)}async getApiToken(){return this.store.get(at("apiToken"))}async setHwid(t){await this.store.set(at("hwid"),t)}async getHwid(){return this.store.get(at("hwid"))}async setDeviceType(t){await this.store.set(at("deviceType"),t)}async getDeviceType(){return this.store.get(at("deviceType"))}async setFormFactor(t){await this.store.set(at("formFactor"),t)}async getFormFactor(){return this.store.get(at("formFactor"))}async setDeviceModel(t){await this.store.set(at("deviceModel"),t)}async getDeviceModel(){return this.store.get(at("deviceModel"))}async setLanguage(t){await this.store.set(at("language"),t)}async getLanguage(){return this.store.get(at("language"),"en")}async setStatusLanguageWasChanged(t){await this.store.set(at("languageWasChanged"),t)}async getStatusLanguageWasChanged(){return this.store.get(at("languageWasChanged"),!1)}async setApiEntrypoint(t){await this.store.set(at("apiEntrypoint"),t)}async getApiEntrypoint(){return this.store.get(at("apiEntrypoint"),"https://api.pushwoosh.com/json/1.3/")}async setTokens(t){await this.store.set(at("tokens"),t)}getTokens(){return this.store.get(at("tokens"))}async setApplicationServerKey(t){await this.store.set(at("applicationServerKey"),t)}async getApplicationServerKey(){return this.store.get(at("applicationServerKey"))}async setIsVapidChanged(t){await this.store.set(at("isVapidChanged"),t)}async getIsVapidChanged(){return this.store.get(at("isVapidChanged"),!1)}async setWebSitePushId(t){await this.store.set(at("webSitePushId"),t)}async getWebSitePushId(){return this.store.get(at("webSitePushId"))}async setDefaultNotificationImage(t){await this.store.set(at("defaultNotificationImage"),t)}async getDefaultNotificationImage(){return this.store.get(at("defaultNotificationImage"),"https://cp.pushwoosh.com/img/logo-medium.png")}async setDefaultNotificationTitle(t){await this.store.set(at("defaultNotificationTitle"),t)}async getDefaultNotificationTitle(){return this.store.get(at("defaultNotificationTitle"),"Pushwoosh notification")}async setUserId(t){await this.store.set(at("userId"),t?`${t}`:void 0)}async getUserId(){return this.store.get(at("userId"))}async setStatusUserIdWasChanged(t){await this.store.set(at("userIdWasChanged"),t)}async getStatusUserIdWasChanged(){return this.store.get(at("userIdWasChanged"),!1)}async setEmail(t){await this.store.set(at("email"),t?`${t}`:void 0)}async getEmail(){return this.store.get(at("email"))}async setStatusEmailWasChanged(t){await this.store.set(at("emailWasChanged"),t)}async getStatusEmailWasChanged(){return this.store.get(at("emailWasChanged"),!1)}async setSmsNumber(t){await this.store.set(at("smsNumber"),t?`${t}`:void 0)}async getSmsNumber(){return this.store.get(at("smsNumber"))}async setStatusSmsNumberWasChanged(t){await this.store.set(at("smsNumberWasChanged"),t)}async getStatusSmsNumberWasChanged(){return this.store.get(at("smsNumberWasChanged"),!1)}async setWhatsAppNumber(t){await this.store.set(at("whatsAppNumber"),t?`${t}`:void 0)}async getWhatsAppNumber(){return this.store.get(at("whatsAppNumber"))}async setStatusWhatsAppNumberWasChanged(t){await this.store.set(at("whatsAppNumberWasChanged"),t)}async getStatusWhatsAppNumberWasChanged(){return this.store.get(at("whatsAppNumberWasChanged"),!1)}async setLastPermissionStatus(t){await this.store.set(at("isLastPermissionStatus"),t)}async getLastPermissionStatus(){return this.store.get(at("isLastPermissionStatus"))}async setStatusManualUnsubscribed(t){await this.store.set(at("isManualUnsubscribed"),t)}getStatusManualUnsubscribed(){return this.store.get(at("isManualUnsubscribed"),!1)}async setStatusCommunicationDisabled(t){await this.store.set(at("isCommunicationDisabled"),t)}getStatusCommunicationDisabled(){return this.store.get(at("isCommunicationDisabled"),!1)}async setCommunicationEnabled(t){await this.store.set(at("communicationEnabled"),t)}getCommunicationEnabled(){return this.store.get(at("communicationEnabled"))}async setStatusDropAllData(t){await this.store.set(at("isDropAllData"),t)}getStatusDropAllData(){return this.store.get(at("isDropAllData"),!1)}async setSdkVersion(t){await this.store.set(at("sdkVersion"),t)}async getSdkVersion(){return this.store.get(at("sdkVersion"))}async setServiceWorkerVersion(t){await this.store.set(at("serviceWorkerVersion"),t)}getServiceWorkerVersion(){return this.store.get(at("serviceWorkerVersion"))}async setServiceWorkerUrl(t){t&&await this.store.set(at("serviceWorkerUrl"),t)}async getServiceWorkerUrl(){return this.store.get(at("serviceWorkerUrl"),s)}async setServiceWorkerScope(t){t&&await this.store.set(at("serviceWorkerScope"),t)}async getServiceWorkerScope(){return this.store.get(at("serviceWorkerScope"))}async setLastOpenMessage(t){await this.store.set(at("lastOpenMessage"),t)}getLastOpenMessage(){return this.store.get(at("lastOpenMessage"))}async setLastOpenApplicationTime(t){await this.store.set(at("lastOpenApplicationTime"),t)}async getLastOpenApplicationTime(){return this.store.get(at("lastOpenApplicationTime"))}async setFeatures(t){await this.store.set(at("features"),t)}async getFeatures(){return this.store.get(at("features"))}async setInitParams(t){await this.store.set(at("init"),t)}async getInitParams(){return this.store.get(at("init"))}async setInboxLastRequestCode(t){await this.store.set(at("inbox.lastRequestCode"),t)}async getInboxLastRequestCode(){return this.store.get(at("inbox.lastRequestCode"),"")}async setInboxLastRequestTime(t){await this.store.set(at("inbox.lastRequestTime"),t)}async getInboxLastRequestTime(){return this.store.get(at("inbox.lastRequestTime"),0)}async setInboxNewMessagesCount(t){await this.store.set(at("inbox.newMessagesCount"),t)}async getInboxNewMessagesCount(){return this.store.get(at("inbox.newMessagesCount"),0)}async setDelayedEvent(t){await this.store.set(at("delayedEvent"),t)}getDelayedEvent(){return this.store.get(at("delayedEvent"))}async setPromptDisplayCount(t){await this.store.set(at("promptDisplayCount"),t)}async getPromptDisplayCount(){return this.store.get(at("promptDisplayCount"),0)}async setPromptLastSeenTime(t){await this.store.set(at("promptLastSeenTime"),t)}async getPromptLastSeenTime(){return this.store.get(at("promptLastSeenTime"),0)}async setLogLevel(t){await this.store.set(at("logLevel"),t)}async getLogLevel(){return this.store.get(at("logLevel"),"error")}async getShownWebPopups(){return this.store.get(at("shownWebPopups"),[])}async addShownWebPopup(t){const e=await this.getShownWebPopups();e.includes(t)||(e.push(t),await this.store.set(at("shownWebPopups"),e))}async setIsRecurringVisitor(t){await this.store.set(at("isRecurringVisitor"),t)}async getIsRecurringVisitor(){return this.store.get(at("isRecurringVisitor"),!1)}}class rt{constructor(t=new it,e=Y){this.data=t,this.logger=e}checkDevice(t){return this.createRequest("checkDevice",t)}getConfig(t){return this.createRequest("getConfig",t)}getPopupForms(t){return this.createRequest("getPopupForms",t)}getPopupFormContent(t){return this.createRequest("getPopupFormContent",t)}recordPopupFormEvent(t){return this.createRequest("recordPopupFormEvent",t)}applicationOpen(t){return this.createRequest("applicationOpen",t)}registerDevice(t){return this.createRequest("registerDevice",t)}unregisterDevice(t){return this.createRequest("unregisterDevice",t)}deleteDevice(t){return this.createRequest("deleteDevice",t)}messageDeliveryEvent(t){return this.createRequest("messageDeliveryEvent",t)}pushStat(t){return this.createRequest("pushStat",t)}setTags(t){return this.createRequest("setTags",t)}getTags(t){return this.createRequest("getTags",t)}registerUser(t){return this.createRequest("registerUser",t)}registerEmail(t){return this.createRequest("registerEmail",t)}registerEmailUser(t){return this.createRequest("registerEmailUser",t)}setEmailTags(t){return this.createRequest("setEmailTags",t)}postEvent(t){return this.createRequest("postEvent",t)}getInboxMessages(t){return this.createRequest("getInboxMessages",t)}inboxStatus(t){return this.createRequest("inboxStatus",t)}pageVisit(t,e){return this.createRequest("pageVisit",t,e)}multiRegisterDevice(t){return this.createRequest("multiRegisterDevice",t)}async createRequest(t,e,s){const a=await this.data.getApiEntrypoint(),i=await this.data.getApiToken(),r=s||a+t,n=i?{headers:{Authorization:`Token ${i}`,"Content-Type":"text/plain;charset=UTF-8",Origin:x().location.origin},credentials:"include"}:{},o=await fetch(r,{method:"POST",headers:{"Content-Type":"text/plain;charset=UTF-8"},body:JSON.stringify({request:e}),...n}),c=await this.checkResponse(o);return c.base_url&&await this.data.setApiEntrypoint(c.base_url),await this.logger.write("apirequest",`${t} call with arguments: ${JSON.stringify(e)} to Pushwoosh has been successful. Result: ${JSON.stringify(c.response)}`),c.response}async checkResponse(t){if(200!==t.status){let e=`status: ${t.status}. statusText: ${t.statusText}.`;try{const s=await t.json();s&&s.status_message&&(e+=` status_code: ${s.status_code}. status_message: ${s.status_message}.`)}catch(t){}throw new Error(e)}const e=await t.json();if(200!==e.status_code)throw new Error(`Error code: ${e.status_code}. Error text: ${e.status_message}`);return e}}class nt{constructor(t,e=new it,s=new rt,a=()=>!1){this.eventBus=t,this.data=e,this.apiClient=s,this.getIsCommunicationDisabled=a}async checkDevice(){const t=await this.getRequestParams();return await this.apiClient.checkDevice(t)}async checkDeviceSubscribeForPushNotifications(t=!0){let e=localStorage.getItem(a);if(void 0===e||!t){const{exist:t,push_token_exist:s}=await this.checkDevice();localStorage.setItem(a,t&&s?i:r),e=localStorage.getItem(a)}return e===i}async ensureDeviceRegistered(){if(this.getIsCommunicationDisabled())return;const{exist:t}=await this.checkDevice();t||await this.apiClient.registerDevice(await this.getRequestParams())}async getConfig(t){const e=await this.getRequestParams();return this.apiClient.getConfig({...e,features:t})}async applicationOpen(){const t=await this.getRequestParams();return await this.data.setLastOpenApplicationTime(Date.now()),this.apiClient.applicationOpen(t)}async registerDevice(){if(await this.data.getStatusCommunicationDisabled())throw new Error("Can't register device: Communication is disabled!");const t=await this.getRequestParams(),e=await this.data.getTokens();if(!e.pushToken)throw new Error("Can't register device: pushToken is not exist!");const s=await this.apiClient.registerDevice({...t,push_token:e.pushToken,auth_token:e.authToken,public_key:e.publicKey});return await this.data.setStatusManualUnsubscribed(!1),localStorage.setItem(a,i),this.eventBus.dispatchEvent("register",{}),s}async unregisterDevice(){const t=await this.getRequestParams(),e=await this.apiClient.unregisterDevice(t);return localStorage.setItem(a,r),this.eventBus.dispatchEvent("unsubscribe",{}),e}async deleteDevice(){const t=await this.getRequestParams(),e=await this.apiClient.deleteDevice(t);return await this.data.setStatusManualUnsubscribed(!0),localStorage.setItem(a,r),this.eventBus.dispatchEvent("unsubscribe",{}),e}async messageDeliveryEvent(t,e,s={}){const a=await this.getRequestParams();return await this.apiClient.messageDeliveryEvent({...a,hash:t,metaData:s})}async pushStat(t,e,s={}){const a=await this.getRequestParams();return await this.apiClient.pushStat({...a,hash:t,metaData:s})}async setTags(t){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));const{hwid:e,device_type:s,...a}=await this.getRequestParams(),i=await this.data.getEmail();return i&&await this.apiClient.setEmailTags({...a,email:i,tags:t}),this.apiClient.setTags({...a,hwid:e,device_type:s,tags:t})}async getTags(){const t=await this.getRequestParams();return this.apiClient.getTags(t)}async setLanguage(t){return this.getIsCommunicationDisabled()?Promise.reject(new Error("Communication is disabled")):(await this.data.setLanguage(t),await this.data.setStatusLanguageWasChanged(!0),this.setTags({Language:t}))}async registerUser(t,e=!0){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));const{hwid:s,device_type:a,...i}=await this.getRequestParams(),r=await this.data.getDeviceType(),n=`${t}`,o=await this.apiClient.registerUser({...i,hwid:s,userId:n,ts_offset:60*-(new Date).getTimezoneOffset(),device_type:r});return await this.data.setUserId(n),e&&await this.data.setStatusUserIdWasChanged(!0),o}async registerEmail(t,e=!0){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));if(!/^\S+@\S+\.\S+$/.test(t))return Promise.reject(new Error("Invalid Email format"));const{hwid:s,device_type:a,...i}=await this.getRequestParams(),r=await this.apiClient.registerEmail({...i,email:t,ts_offset:60*-(new Date).getTimezoneOffset()});return await this.data.setEmail(t),e&&await this.data.setStatusEmailWasChanged(!0),r}async registerSmsNumber(t,e=!0){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));if(!/^\+?[0-9]+$/.test(t))return Promise.reject(new Error("Invalid Phone number format: +1234567890"));const{application:s,userId:a}=await this.getRequestParams(),i=await this.apiClient.registerDevice({application:s,userId:a,hwid:t,device_type:18});return await this.data.setSmsNumber(t),e&&await this.data.setStatusSmsNumberWasChanged(!0),i}async registerWhatsappNumber(t,e=!0){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));if(!/^(whatsapp:)?\+?[0-9]+$/.test(t))return Promise.reject(new Error("Invalid WhatsApp number format: +1234567890"));const{application:s,userId:a}=await this.getRequestParams(),i=await this.apiClient.registerDevice({application:s,userId:a,hwid:t,device_type:21});return await this.data.setWhatsAppNumber(t),e&&await this.data.setStatusWhatsAppNumberWasChanged(!0),i}async getPopupForms(){if(this.getIsCommunicationDisabled())return[];return(await this.apiClient.getPopupForms(await this.getRequestParams())).popup_forms??[]}async getPopupFormContent(t){return this.getIsCommunicationDisabled()?Promise.reject(new Error("Communication is disabled")):this.apiClient.getPopupFormContent({...await this.getRequestParams(),code:t})}async recordPopupFormEvent(t,e){return this.getIsCommunicationDisabled()?Promise.reject(new Error("Communication is disabled")):this.apiClient.recordPopupFormEvent({...await this.getRequestParams(),code:t,event:e})}async postEvent(t,e){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));const s=await this.getRequestParams(),a=new Date,i=a.getTime(),r=Math.floor(i/1e3),n=r-a.getTimezoneOffset()/60*3600,o=await this.data.getLastOpenMessage();if(o&&o.expiry>Date.now()){if(e.msgHash)return Promise.reject(new Error("attribute msgHash already defined"));e={...e,msgHash:o.messageHash}}await this.data.setLastOpenMessage(void 0);const c=await this.apiClient.postEvent({...s,event:t,timestampUTC:r,timestampCurrent:n,attributes:e});return c&&c.code&&this.eventBus.dispatchEvent("receive-in-app-code",{code:c.code}),c}async getInboxMessages(t=0){const e=await this.getRequestParams(),s=await this.data.getInboxLastRequestCode(),a=await this.data.getInboxLastRequestTime();return this.apiClient.getInboxMessages({...e,count:t,last_code:s,last_request_time:a})}async inboxStatus(t,e){const s=await this.getRequestParams();return this.apiClient.inboxStatus({...s,inbox_code:t,status:e,time:(new Date).getTime()})}async pageVisit(t){const e=await this.getRequestParams(),s=await this.data.getFeatures(),a=s&&s.page_visit&&s.page_visit.entrypoint;if(a)return this.apiClient.pageVisit({...e,...t},a)}async multiRegisterDevice(t){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));const e=await this.data.getApplicationCode(),s=await this.data.getDeviceModel(),r=await this.data.getDeviceType(),n=await this.data.getLanguage(),o=await this.data.getSdkVersion(),c=await this.data.getTokens(),u=await this.data.getHwid(),h={application:e,...t};if(t.user_id){h.user_id=String(t.user_id);await this.data.getUserId()!==h.user_id&&(await this.data.setUserId(h.user_id),await this.data.setStatusUserIdWasChanged(!0))}if(t.email){if(!/^\S+@\S+\.\S+$/.test(t.email))return Promise.reject(new Error("Invalid Email format"));await this.data.getEmail()!==t.email&&(await this.data.setEmail(t.email),await this.data.setStatusEmailWasChanged(!0))}if(t.sms_phone_number){if(!/^\+?[0-9]+$/.test(t.sms_phone_number))return Promise.reject(new Error("Invalid Phone number format: +1234567890"));await this.data.getSmsNumber()!==t.sms_phone_number&&(await this.data.setSmsNumber(t.sms_phone_number),await this.data.setStatusSmsNumberWasChanged(!0))}if(t.whatsapp_phone_number){if(!/^(whatsapp:)?\+?[0-9]+$/.test(t.whatsapp_phone_number))return Promise.reject(new Error("Invalid WhatsApp number format: +1234567890"));await this.data.getWhatsAppNumber()!==t.whatsapp_phone_number&&(await this.data.setWhatsAppNumber(t.whatsapp_phone_number),await this.data.setStatusWhatsAppNumberWasChanged(!0))}if(h.language?(await this.data.setLanguage(h.language),await this.data.setStatusLanguageWasChanged(!0)):h.language=n,!h.timezone){const t=60*-(new Date).getTimezoneOffset();h.timezone=String(t)}if(!h.push_devices&&c.pushToken){const t={hwid:u,platform:r,push_token:c.pushToken,sdk_version:o};if(c.publicKey||c.authToken||s){const e={};c.publicKey&&(e.public_key=c.publicKey),c.authToken&&(e.auth_token=c.authToken),s&&(e.browser=s),t.platformData=e}h.push_devices=[t]}const d=await this.apiClient.multiRegisterDevice(h);return h.push_devices?.length&&(await this.data.setStatusManualUnsubscribed(!1),localStorage.setItem(a,i),this.eventBus.dispatchEvent("register",{})),d}async getParams(){return{applicationCode:await this.data.getApplicationCode(),hwid:await this.data.getHwid(),...await this.data.getTokens(),...await this.data.getInitParams()}}async getRequestParams(){const t=await this.data.getApplicationCode(),e=await this.data.getHwid(),s=await this.data.getUserId(),a=await this.data.getDeviceType(),i=await this.data.getDeviceModel(),r=await this.data.getLanguage(),n=await this.data.getSdkVersion();return{application:t,hwid:e,userId:s||e,device_type:a,device_model:i,timezone:60*-(new Date).getTimezoneOffset(),language:r,v:n}}}class ot{constructor(t){this.global=t,this._isSafari=this.isSafariBrowser(),this._isOpera=this.isOperaBrowser(),this._isEdge=this.isEdgeBrowser(),this._isFirefox=this.isFirefoxBrowser(),this._isChrome=this.isChromeBrowser(),this._isMacOS=this.isMacOS(),this._isAvailableServiceWorker=this.canUseServiceWorkers(),this._isAvailableNotifications=this.canReceiveNotifications(),this._platform=this.getPlatformType(),this._browserVersion=this.getBrowserVersion(),this._formFactor=this.getFormFactor()}get isEdge(){return this._isEdge}get isSafari(){return this._isSafari}get isOpera(){return this._isOpera}get isAvailableServiceWorker(){return this._isAvailableServiceWorker}get isAvailableNotifications(){return this._isAvailableNotifications}get platform(){return this._platform}get browserVersion(){return this._browserVersion}get formFactor(){return this._formFactor}get isMobile(){return"MOBILE"===this._formFactor}get isDesktop(){return"DESKTOP"===this._formFactor}isSafariBrowser(){return"safari"in this.global&&navigator.userAgent.indexOf("Safari")>-1}isOperaBrowser(){return-1!==navigator.userAgent.indexOf("Opera")||-1!==navigator.userAgent.indexOf("OPR")}isEdgeBrowser(){return navigator.userAgent.indexOf("Edge")>-1}isFirefoxBrowser(){return-1!==navigator.userAgent.toLowerCase().indexOf("firefox")}isChromeBrowser(){return/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor)&&!this._isOpera&&!this._isEdge}isMacOS(){return"platform"in navigator&&-1!==navigator.platform.toLowerCase().indexOf("mac")}canUseServiceWorkers(){return!!navigator.serviceWorker&&"PushManager"in this.global&&"Notification"in this.global}canReceiveNotifications(){return this._isSafari&&this._isMacOS||this._isAvailableServiceWorker&&!this._isEdge}getPlatformType(){let t=11;switch(!0){case this._isSafari:t=10;break;case this._isOpera||this._isChrome:t=11;break;case this._isFirefox:t=12;break;case this._isEdge:t=150}return t}getFormFactor(){const t=navigator.userAgentData;if(t&&"boolean"==typeof t.mobile)return t.mobile?"MOBILE":"DESKTOP";return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)?"MOBILE":"DESKTOP"}getBrowserVersion(){const{userAgent:t}=navigator,e=t.match(/\bOPR\/(\d+)/);if(null!==e)return`Opera ${e[1]}`;const s=t.match(/\bEdge\/(\d+)/);if(null!==s)return`Edge ${s[1]}`;const a=t.match(/\bEdg\/(\d+)/);if(null!==a)return`Edge ${a[1]}`;let i=t.match(/(opera|chrome|safari|firefox(?=\/))\/?\s*(\d+)/i)||[];const[,r=""]=i;i=i[2]?[r,i[2]]:[navigator.appName,navigator.appVersion,"-?"];const n=t.match(/version\/([.\d]+)/i);return null!==n&&i.splice(1,1,n[1]),i.join(" ")}}class ct{constructor(t,e,s){this.api=t,this.data=e,this.config=s}getPermission(){return Notification.permission}checkIsPermissionGranted(){return this.getPermission()===n}checkIsPermissionDefault(){return this.getPermission()===o}async checkIsManualUnsubscribed(){return this.data.getStatusManualUnsubscribed()}async askPermission(){await Notification.requestPermission()}async getTokens(){return this.data.getTokens()}async subscribe(t){const e=t||await this.trySubscribe();if(!this.checkIsPermissionGranted())return void Y.error("You must have permission granted before subscribe!");const s=this.getPushToken(e),a=e.getKey("p256dh"),i=e.getKey("auth");if(!a||!i)throw new Error("Can't get subscription keys!");const r=btoa(String.fromCharCode.apply(String,new Uint8Array(a))),n=btoa(String.fromCharCode.apply(String,new Uint8Array(i)));await this.data.setTokens({publicKey:r,pushToken:s,authToken:n,endpoint:e.endpoint}),await this.api.registerDevice()}async unsubscribe(){const t=await this.getServiceWorkerRegistration(),e=await t.pushManager.getSubscription();await this.data.setTokens({}),await this.data.setStatusManualUnsubscribed(!0),await this.api.unregisterDevice(),e&&await e.unsubscribe()}async checkIsRegister(){return this.api.checkDeviceSubscribeForPushNotifications()}async checkIsNeedResubscribe(){const t=await this.data.getLastPermissionStatus(),e=this.getPermission();if(t!==e)return await this.data.setLastPermissionStatus(e),!0;const s=await this.getCredentials(),a=this.getPushToken(s),i=await this.data.getTokens(),r=a===(i&&i.pushToken||""),n=await this.data.getIsVapidChanged();return!r||n}async getServiceWorkerRegistration(){if(!this.registration){await this.registerServiceWorker();const t=await this.data.getServiceWorkerUrl();this.registration=await navigator.serviceWorker.getRegistration(t),await this.registration.update()}if(!this.registration)throw new Error("Internal Error: Can't register service worker!");return this.registration}async registerServiceWorker(){const t=await this.data.getServiceWorkerUrl(),e=await this.data.getServiceWorkerScope();let s="";await this.data.getSdkVersion()!==await this.data.getServiceWorkerVersion()&&(s=`?cache_clean=${M()}`),await navigator.serviceWorker.register(`${t}${s}`,{scope:e})}async trySubscribe(){try{return await this.subscribePushManager()}catch(t){return console.error(t),await this.unsubscribe(),this.subscribePushManager()}}async subscribePushManager(){const t=await this.getServiceWorkerRegistration(),e=await this.getApplicationServerKey();return t.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:e?this.urlBase64ToUint8Array(e):null})}async getCredentials(){const t=await this.getServiceWorkerRegistration();return await t.pushManager.getSubscription()}getPushToken(t){return t?t.endpoint:""}async getApplicationServerKey(){return await this.data.getApplicationServerKey()}urlBase64ToUint8Array(t){const e=(t+"=".repeat((4-t.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/"),s=atob(e),a=new Uint8Array(s.length);for(let t=0;t<s.length;++t)a[t]=s.charCodeAt(t);return a}}class ut{constructor(t,e,s){this.api=t,this.config=s,this.data=e}getPermission(){const{permission:t}=this.getPermissionInfo();return t}checkIsPermissionGranted(){return this.getPermission()===n}checkIsPermissionDefault(){return this.getPermission()===o}async checkIsManualUnsubscribed(){return await this.data.getStatusManualUnsubscribed()}async askPermission(){const t={application:await this.data.getApplicationCode(),hwid:await this.data.getHwid()};return new Promise(e=>{safari.pushNotification.requestPermission(this.config.entrypoint||"https://cp.pushwoosh.com/json/1.3/safari",this.config.webSitePushId,t,()=>e())})}getTokens(){return this.data.getTokens()}async subscribe(){if(!this.checkIsPermissionGranted())return void Y.error("You must have permission granted before subscribe!");const{deviceToken:t}=this.getPermissionInfo();await this.data.setTokens({pushToken:t}),await this.api.registerDevice()}async unsubscribe(){await this.data.setTokens({}),await this.data.setStatusManualUnsubscribed(!0),await this.api.unregisterDevice()}async checkIsRegister(){return this.api.checkDeviceSubscribeForPushNotifications()}async checkIsNeedResubscribe(){const t=await this.data.getWebSitePushId(),e=void 0!==t&&this.config.webSitePushId!==t;await this.data.setWebSitePushId(this.config.webSitePushId);const s=await this.data.getLastPermissionStatus(),a=this.getPermission();return s!==a?(await this.data.setLastPermissionStatus(a),!0):e}getPermissionInfo(){return safari.pushNotification.permission(this.config.webSitePushId)}}class ht{constructor(){this.ready=!1,this.moduleRegistry={},this.addEventHandler=(t,e)=>this.eventBus.addEventHandler(t,e),this.removeEventHandler=(t,e)=>this.eventBus.removeEventHandler(t,e),this.dispatchEvent=(t,e)=>this.eventBus.dispatchEvent(t,e),this.debug={async showLog(){const t=await K.getAll();console.log(t)},async showKeyValues(){const t=await $.getAll();console.log(t)},async showMessages(){(await z.getAll()).forEach(t=>console.log(t))}},this.eventBus=new Q,this.data=new it,this.apiClient=new rt(this.data),this.api=new nt(this.eventBus,this.data,this.apiClient,()=>this.isCommunicationDisabled),this.platformChecker=new ot(x()),this.inboxModel=new st(this.eventBus,this.data,this.api),this.pwinbox=new Z(this.data,this.api,this.inboxModel)}push(t){if(T(t))this.subscribeToLegacyEvents(c,t);else{if(!Array.isArray(t))throw new Error("Invalid command!");if("init"===t[0])this.initialize(t[1]).catch(t=>{console.error("Pushwoosh: Error during initialization",t)});else if(!this.subscribeToLegacyEvents(t[0],t[1]))throw console.log("Pushwoosh: Unknown command",t),new Error("Unknown command!")}}async subscribe(t=!0){if(this.isCommunicationDisabled)throw new Error("Communication is disabled!");if(this.driver.checkIsPermissionDefault()){this.eventBus.dispatchEvent("show-notification-permission-dialog",{}),await this.driver.askPermission();const t=this.driver.getPermission();this.eventBus.dispatchEvent("hide-notification-permission-dialog",{permission:t})}const e=this.driver.getPermission(),s=await this.data.getStatusManualUnsubscribed(),a=await this.api.checkDeviceSubscribeForPushNotifications(!1);if(e===n){this.eventBus.dispatchEvent("permission-granted",{});return(!a&&!s||t)&&await this.driver.subscribe(),void this.eventBus.dispatchEvent("subscribe",{})}if("denied"===e)return this.eventBus.dispatchEvent("permission-denied",{}),void(a&&await this.driver.unsubscribe())}async unsubscribe(){try{await this.driver.unsubscribe()}catch(t){throw Y.error(t,"Error occurred during the unsubscribe"),t}}async forceSubscribe(){await this.subscribe(!0)}isDeviceRegistered(){return localStorage.getItem(a)===i}isDeviceUnregistered(){return localStorage.getItem(a)===r}async isSubscribed(){return this.api.checkDeviceSubscribeForPushNotifications()}async isCommunicationEnabled(){return!await this.data.getStatusCommunicationDisabled()}async setCommunicationEnabled(t=!0){if(await this.data.setCommunicationEnabled(t),t){this.isCommunicationDisabled=!1,await this.data.setStatusDropAllData(!1),await this.finishInit();this.driver.checkIsPermissionGranted()&&(await this.api.registerDevice(),await this.sendData())}else await this.api.unregisterDevice();this.eventBus.dispatchEvent("change-enabled-communication",{isEnabled:t});const e=await this.data.getDeviceType();await this.api.postEvent("GDPRConsent",{channel:t,device_type:e})}async removeAllDeviceData(){const t=await this.data.getDeviceType();await this.api.postEvent("GDPRDelete",{status:!0,device_type:t}),await this.api.deleteDevice(),await this.data.clearAll(),await this.data.setStatusDropAllData(!0)}async getHWID(){return await this.data.getHwid()}async getPushToken(){const{pushToken:t}=await this.data.getTokens();return t}async getUserId(){return await this.data.getUserId()}async getParams(){return await this.api.getParams()}isAvailableNotifications(){return this.platformChecker.isAvailableNotifications}async sendStatisticsVisitedPage(){const{document:{title:t},location:{origin:e,pathname:s,href:a}}=window;await this.api.pageVisit({title:t,url_path:`${e}${s}`,url:a})}async initialize(t){this.initParams={...E,...t};const e=localStorage.getItem("PW_SET_LOGGER_LEVEL");if(Y.setLevel(e||t.logLevel||"error"),t.logLevel&&await this.data.setLogLevel(t.logLevel),!this.isAvailableNotifications())return;if(!t.applicationCode)throw new Error("Can't find application code!");const s=!1===t.communicationEnabled,a=await this.data.getCommunicationEnabled(),i=await this.data.getStatusCommunicationDisabled();(s&&!0!==a||!1===a||i)&&(this.isCommunicationDisabled=!0);const r=await this.data.getApplicationCode(),n=await this.isUserIdChanged();(!r||r!==t.applicationCode||n)&&(await this.data.setHwid(""),await this.data.setUserId(),await this.data.setEmail(),await this.data.setStatusLanguageWasChanged(!1)),await this.data.setApplicationCode(t.applicationCode);const o=t.unifiedPlatform?11:this.platformChecker.getPlatformType();await this.data.setDeviceType(o),await this.data.setFormFactor(this.platformChecker.formFactor),await this.data.setDeviceModel(this.platformChecker.getBrowserVersion());if(await this.data.getStatusLanguageWasChanged()||await this.data.setLanguage(t.tags?.Language||navigator.language),await this.data.setApiEntrypoint(t.pushwooshUrl||""),await this.data.setApiToken(t.apiToken||""),await this.data.setSdkVersion("3.64.0"),this.isCommunicationDisabled)this.eventBus.dispatchEvent("communication-disabled",{});else{await this.finishInit();try{await this.inboxModel.updateMessages()}catch(t){Y.write("error",t)}const e=await this.data.getDelayedEvent();if(e){const{type:t,payload:s}=e;this.emitLegacyEventsFromServiceWorker(t,s),await this.data.setDelayedEvent(null)}if(this.platformChecker.isSafari&&!t.unifiedPlatform){const t=/#P(.*)/,e=decodeURIComponent(document.location.hash);t.test(e)&&this.api.pushStat(t.exec(e)[1]).then(()=>history.pushState(null,"","#"))}}}async finishInit(){await this.ensureHwid(),await this.loadConfig(),await this.open(),await this.sendData();await this.data.getApplicationServerKey()?await this.initPushNotifications(this.initParams):Y.error("Pushwoosh: No vapid key found! Please, check your application settings in Pushwoosh dashboard."),this.ready=!0,this.eventBus.dispatchEvent("ready",{}),"serviceWorker"in navigator&&(navigator.serviceWorker.onmessage=t=>this.onServiceWorkerMessage(t)),localStorage.setItem("pushwoosh-websdk-status","init"),document.dispatchEvent(new CustomEvent("pushwoosh.initialized",{detail:{pw:this}}))}async ensureHwid(t=!1){await this.data.getHwid()&&!t||await this.data.setHwid(this.initParams.applicationCode+"_"+M())}async isUserIdChanged(){const{userId:t}=this.initParams,e=await this.data.getUserId(),s=await this.data.getStatusUserIdWasChanged();return!!t&&"user_id"!==t&&t!==e&&!s}async defaultProcess(){const t=this.driver.getPermission();"granted"===t&&await this.data.setLastPermissionStatus(t);const e=await this.data.getStatusCommunicationDisabled(),s=await this.data.getStatusDropAllData(),a=await this.driver.checkIsNeedResubscribe();if(e||s)return void await this.unsubscribe();a&&(await this.unsubscribe(),await this.data.setStatusManualUnsubscribed(!1),await this.data.setIsVapidChanged(!1));const i=await this.data.getStatusManualUnsubscribed(),r=await this.api.checkDeviceSubscribeForPushNotifications(!1);switch(t){case o:this.eventBus.dispatchEvent("permission-default",{}),r&&await this.unsubscribe();break;case"denied":this.eventBus.dispatchEvent("permission-denied",{}),r&&await this.unsubscribe();break;case n:this.eventBus.dispatchEvent("permission-granted",{}),i&&r&&await this.unsubscribe(),(!r&&!i||a)&&await this.subscribe(!0)}}onServiceWorkerMessage(t){const{data:e={}}=t||{},{type:s="",payload:a={}}=e||{};this.emitLegacyEventsFromServiceWorker(s,a)}async open(t){let e=await this.data.getLastOpenApplicationTime();const s=Date.now();e||(e=0);(t||!(s-e<36e5))&&(await this.data.setLastOpenApplicationTime(s),await this.api.applicationOpen())}async sendData(){const t=this.initParams,e=await this.data.getUserId();t.userId&&"user_id"!==t.userId&&t.userId!==e&&await this.api.registerUser(t.userId,!1);const s=[{test:async()=>{if(await this.data.getStatusEmailWasChanged())return!1;const e=await this.data.getEmail();return!!t.email&&t.email!==e},task:async()=>{await this.api.registerEmail(t.email,!1)}},{test:async()=>{if(await this.data.getStatusSmsNumberWasChanged())return!1;const e=await this.data.getSmsNumber();return!!t.smsNumber&&t.smsNumber!==e},task:async()=>{await this.api.registerSmsNumber(t.smsNumber,!1)}},{test:async()=>{if(await this.data.getStatusWhatsAppNumberWasChanged())return!1;const e=await this.data.getWhatsAppNumber();return!!t.whatsAppNumber&&t.whatsAppNumber!==e},task:async()=>{await this.api.registerWhatsappNumber(t.whatsAppNumber,!1)}},{test:async()=>!!t.tags||await this.data.getStatusLanguageWasChanged(),task:async()=>{const e=await this.data.getLanguage(),s={...t.tags||{},Language:e};await this.api.setTags(s)}}];await Promise.all(s.map(async t=>{try{await t.test()&&await t.task()}catch(t){console.error("Pushwoosh: Error during data registration",t)}}))}async loadConfig(){const t=await this.api.getConfig(["page_visit","vapid_key","web_in_apps","events","subscription_prompt","popup_forms"]),e=t&&t.features;if(await this.data.setFeatures(e),e){if(e.page_visit&&e.page_visit.enabled&&(await $.set("PAGE_VISITED_URL",e.page_visit.entrypoint),this.sendStatisticsVisitedPage()),e.events&&e.events.length){e.events.some(t=>t===I)&&this.sendPostEventVisitedPage()}if(e.vapid_key){const t=await this.data.getApplicationServerKey();await this.data.setApplicationServerKey(e.vapid_key),t!==e.vapid_key&&await this.data.setIsVapidChanged(!0)}}}async initPushNotifications(t){await this.data.setDefaultNotificationImage(t.defaultNotificationImage),await this.data.setDefaultNotificationTitle(t.defaultNotificationTitle),await this.data.setServiceWorkerUrl(t.serviceWorkerUrl),await this.data.setServiceWorkerScope(t.scope),await this.data.setInitParams(t),await this.initDriver();try{await this.defaultProcess()}catch(t){Y.error(t,"Internal error: defaultProcess fail")}}async initDriver(){if(this.platformChecker.isSafari&&!this.initParams.unifiedPlatform){const{safariWebsitePushID:t}=await this.data.getInitParams();return t?void(this.driver=new ut(this.api,this.data,{webSitePushId:t})):void Y.info("For work with Safari Push Notification add safariWebsitePushID to initParams!")}Y.info({isAvailableServiceWorker:this.platformChecker.isAvailableServiceWorker}),this.platformChecker.isAvailableServiceWorker&&(this.driver=new ct(this.api,this.data,{}))}async sendPostEventVisitedPage(){const{document:{title:t},location:{href:e}}=window,s=await this.data.getDeviceType();this.api.postEvent(I,{url:e,title:t,device_type:s})}subscribeToLegacyEvents(t,e){let s=!0;switch(!0){case"onLoad"===t:e();break;case t===c:if(this.ready){e(this.api);break}this.eventBus.addEventHandler("ready",()=>e(this.api));break;case t in _:this.eventBus.addEventHandler(_[t].name,s=>{cons