web-push-notifications 3.72.0 → 3.74.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.
- package/CHANGELOG.md +18 -0
- package/core/Pushwoosh.d.ts +6 -0
- package/core/constants.d.ts +4 -0
- package/modules/Api/Api.d.ts +4 -1
- package/modules/ApiClient/ApiClient.errors.d.ts +5 -0
- package/npm.js +1 -1
- package/npm.js.map +1 -1
- package/package.json +1 -1
- package/service-worker.js +1 -1
- package/service-worker.js.map +1 -1
- package/widget-subscription-button.js.map +1 -1
- package/pushwoosh-web-notifications.d.ts +0 -1
- package/pushwoosh-widget-inbox.d.ts +0 -1
- package/pushwoosh-widget-subscribe-popup.d.ts +0 -1
- package/pushwoosh-widget-subscription-button.d.ts +0 -1
- package/pushwoosh-widget-subscription-prompt.d.ts +0 -1
- package/pushwoosh-widget-web-popups.d.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
Entries start at 3.71.0; for earlier versions see the git history and the
|
|
4
4
|
[GitHub releases](https://github.com/Pushwoosh/web-push-notifications/releases).
|
|
5
5
|
|
|
6
|
+
## 3.74.0
|
|
7
|
+
|
|
8
|
+
- Init stops instead of firing every doomed request when the Pushwoosh API rejects the application
|
|
9
|
+
code (`status_code` 210): no further init steps, no `ready`, and one `Logger.error` naming the
|
|
10
|
+
applicationCode and the code. An ordinary per-call or network failure still leaves init running
|
|
11
|
+
to `ready`.
|
|
12
|
+
- API failures now arrive as `ApiRequestError` carrying the application `status_code` as a field,
|
|
13
|
+
from both the HTTP-level and the body-level branch of the response check.
|
|
14
|
+
|
|
15
|
+
## 3.73.0
|
|
16
|
+
|
|
17
|
+
- Requests that need an hwid are no longer sent without one. Where the SDK storage keeps no hwid
|
|
18
|
+
(in-app webview, private window, insecure context) every device-bound call used to leave with an
|
|
19
|
+
empty hwid and be rejected by the backend; the whole class now stops inside the SDK, with the
|
|
20
|
+
reason logged once.
|
|
21
|
+
- Email, SMS and WhatsApp keep working there: they are registered against the userId, which is taken
|
|
22
|
+
from the init params when the storage has none to give.
|
|
23
|
+
|
|
6
24
|
## 3.72.0
|
|
7
25
|
|
|
8
26
|
- The `pushwoosh-widget-subscription-prompt` bundle is no longer fetched for visitors who would never
|
package/core/Pushwoosh.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export declare class Pushwoosh {
|
|
|
16
16
|
driver?: IPushService;
|
|
17
17
|
platformChecker: PlatformChecker;
|
|
18
18
|
private isPushDisabled;
|
|
19
|
+
private isInitAborted;
|
|
19
20
|
pwinbox: InboxMessagesPublic;
|
|
20
21
|
private inboxModel;
|
|
21
22
|
moduleRegistry: IModuleRegistry;
|
|
@@ -172,7 +173,12 @@ export declare class Pushwoosh {
|
|
|
172
173
|
private finishInit;
|
|
173
174
|
/** Run an init step that may fail: init must always reach 'ready', or every widget stays silent. */
|
|
174
175
|
private initStep;
|
|
176
|
+
/** Logged once per init and read by the integrator in the console, so it names the parameter to fix. */
|
|
177
|
+
private abortInit;
|
|
175
178
|
private ensureHwid;
|
|
179
|
+
private readHwid;
|
|
180
|
+
/** `user_id` is the documented placeholder for "no userId", so it identifies nobody. */
|
|
181
|
+
private getInitUserId;
|
|
176
182
|
private isUserIdChanged;
|
|
177
183
|
/**
|
|
178
184
|
* Default process during PW initialization.
|
package/core/constants.d.ts
CHANGED
|
@@ -39,3 +39,7 @@ export declare const EVENT_GDPR_CONSENT = "GDPRConsent";
|
|
|
39
39
|
export declare const EVENT_GDPR_DELETE = "GDPRDelete";
|
|
40
40
|
export declare const EVENT_PW_SITE_OPENED = "PW_SiteOpened";
|
|
41
41
|
export declare const PAGE_VISITED_URL = "PAGE_VISITED_URL";
|
|
42
|
+
export declare const HWID_UNAVAILABLE_MESSAGE: string;
|
|
43
|
+
export declare const IDENTITY_UNAVAILABLE_MESSAGE: string;
|
|
44
|
+
export declare const API_STATUS_CODE_INVALID_APPLICATION = 210;
|
|
45
|
+
export declare const FATAL_API_STATUS_CODES: number[];
|
package/modules/Api/Api.d.ts
CHANGED
|
@@ -9,8 +9,9 @@ export declare class Api {
|
|
|
9
9
|
private readonly apiClient;
|
|
10
10
|
private readonly eventBus;
|
|
11
11
|
private readonly getIsCommunicationDisabled;
|
|
12
|
+
private readonly getInitUserId;
|
|
12
13
|
private ensureDeviceRegisteredPromise;
|
|
13
|
-
constructor(eventBus: EventBus, data?: Data, apiClient?: ApiClient, getIsCommunicationDisabled?: () => boolean | undefined);
|
|
14
|
+
constructor(eventBus: EventBus, data?: Data, apiClient?: ApiClient, getIsCommunicationDisabled?: () => boolean | undefined, getInitUserId?: () => string | undefined);
|
|
14
15
|
checkDevice(): Promise<IMapResponse['checkDevice']>;
|
|
15
16
|
checkDeviceSubscribeForPushNotifications(useCache?: boolean): Promise<boolean>;
|
|
16
17
|
ensureDeviceRegistered(): Promise<boolean>;
|
|
@@ -51,4 +52,6 @@ export declare class Api {
|
|
|
51
52
|
multiRegisterDevice(request: Partial<MultiRegisterDeviceRequest>): Promise<IMapResponse['multiRegisterDevice']>;
|
|
52
53
|
getParams(): Promise<any>;
|
|
53
54
|
private getRequestParams;
|
|
55
|
+
private getIdentityRequestParams;
|
|
56
|
+
private requireHwid;
|
|
54
57
|
}
|
package/npm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!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 i in s)("object"==typeof exports?exports:t)[i]=s[i]}}(this,()=>(()=>{"use strict";const t={d:(e,s)=>{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=>{Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}};let e={};t.r(e),t.d(e,{Pushwoosh:()=>ut});const s="/pushwoosh-service-worker.js",i="deviceRegistrationStatus",a="registered",r="unregistered",n="granted",o="default",c="onReady",h="onSubscribe",u="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 T(){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 M=t=>"function"==typeof t,_={[d]:{name:"register"},[h]:{name:"subscribe"},[u]:{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",R="messages",N="inboxMessages";function A(t,e){return function(s){s.objectStoreNames.contains(t)||e(s)}}const q=[A(W,function(t){t.createObjectStore(W,{keyPath:"key"})}),A("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})}),A(R,function(t){t.createObjectStore(R,{keyPath:"id",autoIncrement:!0}).createIndex("date","date",{unique:!1})}),A(N,function(t){const e="status",s=t.createObjectStore(N,{keyPath:"inbox_id",autoIncrement:!1});s.createIndex(e,e,{unique:!1,multiEntry:!0}),s.createIndex("rt","rt",{unique:!1,multiEntry:!0})})];class O{get all(){return q}}class L{constructor(t,e=new O){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 i=s.target.result;i.onversionchange=U.bind(null,i,e),t(i)},s.onerror=()=>e(s.error),s.onupgradeneeded=t=>{const s=t.target.result;s.onversionchange=U.bind(null,s,e);new L(s).applyMigrations()}})),B}function V(t){return F().then(e=>new Promise((s,i)=>t(e,s,i)))}class j{_add(t){return V((e,s,i)=>{const a=e.transaction([this.name],"readwrite").objectStore(this.name).add(t);a.onsuccess=()=>{s(t)},a.onerror=()=>{i(a.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,i)=>{const a=e.transaction([this.name],"readwrite").objectStore(this.name).delete(t);a.onsuccess=()=>{s(a.result)},a.onerror=()=>{i(a.error)}})}getAll(){return V((t,e,s)=>{const i=[],a=t.transaction(this.name).objectStore(this.name).openCursor();a.onsuccess=t=>{const s=t.target.result;s?(s.value&&i.push(s.value),s.continue()):e(i)},a.onerror=()=>{s(a.error)}})}}const $=(H=W,{get:(t,e)=>V((s,i,a)=>{const r=s.transaction(H).objectStore(H).get(t);let n,o=!1,c=!1;const h=()=>{clearTimeout(n),o?i(r.result?.value||e):c?a(r.error):n=setTimeout(h,0)};r.onsuccess=()=>o=!0,r.onerror=()=>c=!0,h()}),getAll:()=>V((t,e,s)=>{const i={},a=t.transaction(H).objectStore(H).openCursor();let r,n=!1,o=!1;const c=()=>{clearTimeout(r),n?e(i):o?s(a.error):r=setTimeout(c,0)};a.onsuccess=t=>{const e=t.target.result;e?(i[e.key]=e.value.value,e.continue()):n=!0},a.onerror=()=>o=!0,c()}),async extend(t,e){const s=await this.get(t),{...i}=e;await this.set(t,{...s,...i})},set:(t,e)=>V((s,i,a)=>{const r=s.transaction([H],"readwrite").objectStore(H).put({key:t,value:e});let n,o=!1,c=!1;const h=()=>{clearTimeout(n),o?i(t):c?a(r.error):n=setTimeout(h,0)};r.onsuccess=()=>o=!0,r.onerror=()=>c=!0,h()})});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 i={type:t,environment:this.environment,message:`${e}`,date:new Date};return e instanceof Error&&(i.stack=e.stack),s&&(i.additional=s),this._add(i)}},z=new class extends j{constructor(){super(...arguments),this.name=R,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||T(),i=this.handlers[t];return i?(i.forEach(t=>{M(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,i=new X){this.data=t,this.api=e,this.inboxModel=s,this.dateModule=i,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 i=[],a=[];e.forEach(async e=>{-1!==t.indexOf(e.inbox_id)&&(e.status=s,i.push(e),a.push(this.api.inboxStatus(e.order,e.status)))}),await this.inboxModel.putBulkMessages(i),await Promise.all(a)}async publicMessageBuilder({action_type:t,action_params:e,image:s,title:i,send_date:a,inbox_id:r,text:n,status:o}){const c=s||await this.data.getDefaultNotificationImage(),h=i||await this.data.getDefaultNotificationTitle(),u=JSON.parse(e);return this.dateModule.date=new Date(1e3*parseInt(a)),this.dateModule.setLocal(),{title:h,imageUrl:c,code:r,message:n,sendDate:this.dateModule.date.toISOString(),type:this.messageTypeFactory(t,u),link:u?.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),i=this.messageTypeFactory(e.action_type,s);2===i&&null!=s.l?document.location.href=s.l:3===i&&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.api.ensureDeviceRegistered(),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,i)=>{t.onsuccess=()=>{s(e)},t.onerror=()=>{i(t.error)}})}readRequestPromise(t,e){return new Promise((s,i)=>{t.onsuccess=t=>{const i=t.target;s(i.result||e)},t.onerror=()=>{i(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,i)=>{t.onsuccess=t=>{const i=t.target.result;i?(e.push(i.value),i.continue()):s(e)},t.onerror=()=>{i(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 i=await this.getDB();return new tt(i,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 i=await this.getDB();return new tt(i,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 i=await this.getDB(),a=new tt(i,t);return a.index=e,a.countByIndex(s)}}class st{constructor(t,e,s,i=new et,a=new X){this.eventBus=t,this.data=e,this.api=s,this.storage=i,this.storeName="inboxMessages",this.dateModule=a}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 it=t=>`params.${t}`;class at{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(it(e),void 0)}async setApplicationCode(t){await this.store.set(it("applicationCode"),t)}async getApplicationCode(){return this.store.get(it("applicationCode"))}async setApiToken(t){return await this.store.set(it("apiToken"),t)}async getApiToken(){return this.store.get(it("apiToken"))}async setHwid(t){await this.store.set(it("hwid"),t)}async getHwid(){return this.store.get(it("hwid"))}async setDeviceType(t){await this.store.set(it("deviceType"),t)}async getDeviceType(){return this.store.get(it("deviceType"))}async setFormFactor(t){await this.store.set(it("formFactor"),t)}async getFormFactor(){return this.store.get(it("formFactor"))}async setDeviceModel(t){await this.store.set(it("deviceModel"),t)}async getDeviceModel(){return this.store.get(it("deviceModel"))}async setLanguage(t){await this.store.set(it("language"),t)}async getLanguage(){return this.store.get(it("language"),"en")}async setStatusLanguageWasChanged(t){await this.store.set(it("languageWasChanged"),t)}async getStatusLanguageWasChanged(){return this.store.get(it("languageWasChanged"),!1)}async setApiEntrypoint(t){await this.store.set(it("apiEntrypoint"),t)}async getApiEntrypoint(){return this.store.get(it("apiEntrypoint"),"https://api.pushwoosh.com/json/1.3/")}async setTokens(t){await this.store.set(it("tokens"),t)}getTokens(){return this.store.get(it("tokens"))}async setApplicationServerKey(t){await this.store.set(it("applicationServerKey"),t)}async getApplicationServerKey(){return this.store.get(it("applicationServerKey"))}async setIsVapidChanged(t){await this.store.set(it("isVapidChanged"),t)}async getIsVapidChanged(){return this.store.get(it("isVapidChanged"),!1)}async setWebSitePushId(t){await this.store.set(it("webSitePushId"),t)}async getWebSitePushId(){return this.store.get(it("webSitePushId"))}async setDefaultNotificationImage(t){await this.store.set(it("defaultNotificationImage"),t)}async getDefaultNotificationImage(){return this.store.get(it("defaultNotificationImage"),"https://cp.pushwoosh.com/img/logo-medium.png")}async setDefaultNotificationTitle(t){await this.store.set(it("defaultNotificationTitle"),t)}async getDefaultNotificationTitle(){return this.store.get(it("defaultNotificationTitle"),"Pushwoosh notification")}async setUserId(t){await this.store.set(it("userId"),t?`${t}`:void 0)}async getUserId(){return this.store.get(it("userId"))}async setStatusUserIdWasChanged(t){await this.store.set(it("userIdWasChanged"),t)}async getStatusUserIdWasChanged(){return this.store.get(it("userIdWasChanged"),!1)}async setEmail(t){await this.store.set(it("email"),t?`${t}`:void 0)}async getEmail(){return this.store.get(it("email"))}async setStatusEmailWasChanged(t){await this.store.set(it("emailWasChanged"),t)}async getStatusEmailWasChanged(){return this.store.get(it("emailWasChanged"),!1)}async setSmsNumber(t){await this.store.set(it("smsNumber"),t?`${t}`:void 0)}async getSmsNumber(){return this.store.get(it("smsNumber"))}async setStatusSmsNumberWasChanged(t){await this.store.set(it("smsNumberWasChanged"),t)}async getStatusSmsNumberWasChanged(){return this.store.get(it("smsNumberWasChanged"),!1)}async setWhatsAppNumber(t){await this.store.set(it("whatsAppNumber"),t?`${t}`:void 0)}async getWhatsAppNumber(){return this.store.get(it("whatsAppNumber"))}async setStatusWhatsAppNumberWasChanged(t){await this.store.set(it("whatsAppNumberWasChanged"),t)}async getStatusWhatsAppNumberWasChanged(){return this.store.get(it("whatsAppNumberWasChanged"),!1)}async setLastPermissionStatus(t){await this.store.set(it("isLastPermissionStatus"),t)}async getLastPermissionStatus(){return this.store.get(it("isLastPermissionStatus"))}async setStatusManualUnsubscribed(t){await this.store.set(it("isManualUnsubscribed"),t)}getStatusManualUnsubscribed(){return this.store.get(it("isManualUnsubscribed"),!1)}async setStatusCommunicationDisabled(t){await this.store.set(it("isCommunicationDisabled"),t)}getStatusCommunicationDisabled(){return this.store.get(it("isCommunicationDisabled"),!1)}async setCommunicationEnabled(t){await this.store.set(it("communicationEnabled"),t)}getCommunicationEnabled(){return this.store.get(it("communicationEnabled"))}async setStatusDropAllData(t){await this.store.set(it("isDropAllData"),t)}getStatusDropAllData(){return this.store.get(it("isDropAllData"),!1)}async setSdkVersion(t){await this.store.set(it("sdkVersion"),t)}async getSdkVersion(){return this.store.get(it("sdkVersion"))}async setServiceWorkerVersion(t){await this.store.set(it("serviceWorkerVersion"),t)}getServiceWorkerVersion(){return this.store.get(it("serviceWorkerVersion"))}async setServiceWorkerUrl(t){t&&await this.store.set(it("serviceWorkerUrl"),t)}async getServiceWorkerUrl(){return this.store.get(it("serviceWorkerUrl"),s)}async setServiceWorkerScope(t){t&&await this.store.set(it("serviceWorkerScope"),t)}async getServiceWorkerScope(){return this.store.get(it("serviceWorkerScope"))}async setLastOpenMessage(t){await this.store.set(it("lastOpenMessage"),t)}getLastOpenMessage(){return this.store.get(it("lastOpenMessage"))}async setLastOpenApplicationTime(t){await this.store.set(it("lastOpenApplicationTime"),t)}async getLastOpenApplicationTime(){return this.store.get(it("lastOpenApplicationTime"))}async setFeatures(t){await this.store.set(it("features"),t)}async getFeatures(){return this.store.get(it("features"))}async setInitParams(t){await this.store.set(it("init"),t)}async getInitParams(){return this.store.get(it("init"))}async setInboxLastRequestCode(t){await this.store.set(it("inbox.lastRequestCode"),t)}async getInboxLastRequestCode(){return this.store.get(it("inbox.lastRequestCode"),"")}async setInboxLastRequestTime(t){await this.store.set(it("inbox.lastRequestTime"),t)}async getInboxLastRequestTime(){return this.store.get(it("inbox.lastRequestTime"),0)}async setInboxNewMessagesCount(t){await this.store.set(it("inbox.newMessagesCount"),t)}async getInboxNewMessagesCount(){return this.store.get(it("inbox.newMessagesCount"),0)}async setDelayedEvent(t){await this.store.set(it("delayedEvent"),t)}getDelayedEvent(){return this.store.get(it("delayedEvent"))}async setPromptDisplayCount(t){await this.store.set(it("promptDisplayCount"),t)}async getPromptDisplayCount(){return this.store.get(it("promptDisplayCount"),0)}async setPromptLastSeenTime(t){await this.store.set(it("promptLastSeenTime"),t)}async getPromptLastSeenTime(){return this.store.get(it("promptLastSeenTime"),0)}async setLogLevel(t){await this.store.set(it("logLevel"),t)}async getLogLevel(){return this.store.get(it("logLevel"),"error")}async getShownWebPopups(){return this.store.get(it("shownWebPopups"),[])}async addShownWebPopup(t){const e=await this.getShownWebPopups();e.includes(t)||(e.push(t),await this.store.set(it("shownWebPopups"),e))}async setIsRecurringVisitor(t){await this.store.set(it("isRecurringVisitor"),t)}async getIsRecurringVisitor(){return this.store.get(it("isRecurringVisitor"),!1)}}class rt{constructor(t=new at,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 i=await this.data.getApiEntrypoint(),a=await this.data.getApiToken(),r=s||i+t,n=a?{headers:{Authorization:`Token ${a}`,"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 at,s=new rt,i=()=>!1){this.ensureDeviceRegisteredPromise=null,this.eventBus=t,this.data=e,this.apiClient=s,this.getIsCommunicationDisabled=i}async checkDevice(){const t=await this.getRequestParams();return await this.apiClient.checkDevice(t)}async checkDeviceSubscribeForPushNotifications(t=!0){let e=localStorage.getItem(i);if(void 0===e||!t){const{exist:t,push_token_exist:s}=await this.checkDevice();localStorage.setItem(i,t&&s?a:r),e=localStorage.getItem(i)}return e===a}async ensureDeviceRegistered(){return!this.getIsCommunicationDisabled()&&(this.ensureDeviceRegisteredPromise||(this.ensureDeviceRegisteredPromise=this.registerDeviceIfNotExist().catch(t=>{throw this.ensureDeviceRegisteredPromise=null,t})),this.ensureDeviceRegisteredPromise)}async registerDeviceIfNotExist(){const{exist:t}=await this.checkDevice();return!t&&(await this.apiClient.registerDevice(await this.getRequestParams()),!0)}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(i,a),this.eventBus.dispatchEvent("register",{}),s}async unregisterDevice(){const t=await this.getRequestParams(),e=await this.apiClient.unregisterDevice(t);return localStorage.setItem(i,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(i,r),this.eventBus.dispatchEvent("unsubscribe",{}),e}async messageDeliveryEvent(t,e,s={}){const i=await this.getRequestParams();return await this.apiClient.messageDeliveryEvent({...i,hash:t,metaData:s})}async pushStat(t,e,s={}){const i=await this.getRequestParams();return await this.apiClient.pushStat({...i,hash:t,metaData:s})}async setTags(t){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));const{hwid:e,device_type:s,...i}=await this.getRequestParams(),a=await this.data.getEmail();return a&&await this.apiClient.setEmailTags({...i,email:a,tags:t}),this.apiClient.setTags({...i,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:i,...a}=await this.getRequestParams(),r=await this.data.getDeviceType(),n=`${t}`,o=await this.apiClient.registerUser({...a,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:i,...a}=await this.getRequestParams(),r=await this.apiClient.registerEmail({...a,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:i}=await this.getRequestParams(),a=await this.apiClient.registerDevice({application:s,userId:i,hwid:t,device_type:18});return await this.data.setSmsNumber(t),e&&await this.data.setStatusSmsNumberWasChanged(!0),a}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:i}=await this.getRequestParams(),a=await this.apiClient.registerDevice({application:s,userId:i,hwid:t,device_type:21});return await this.data.setWhatsAppNumber(t),e&&await this.data.setStatusWhatsAppNumberWasChanged(!0),a}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(),i=new Date,a=i.getTime(),r=Math.floor(a/1e3),n=r-i.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(),i=await this.data.getInboxLastRequestTime();return this.apiClient.getInboxMessages({...e,count:t,last_code:s,last_request_time:i})}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(),i=s&&s.page_visit&&s.page_visit.entrypoint;if(i)return this.apiClient.pageVisit({...e,...t},i)}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(),h=await this.data.getHwid(),u={application:e,...t};if(t.user_id){u.user_id=String(t.user_id);await this.data.getUserId()!==u.user_id&&(await this.data.setUserId(u.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(u.language?(await this.data.setLanguage(u.language),await this.data.setStatusLanguageWasChanged(!0)):u.language=n,!u.timezone){const t=60*-(new Date).getTimezoneOffset();u.timezone=String(t)}if(!u.push_devices&&c.pushToken){const t={hwid:h,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}u.push_devices=[t]}const d=await this.apiClient.multiRegisterDevice(u);return u.push_devices?.length&&(await this.data.setStatusManualUnsubscribed(!1),localStorage.setItem(i,a),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(),i=await this.data.getDeviceType(),a=await this.data.getDeviceModel(),r=await this.data.getLanguage(),n=await this.data.getSdkVersion();return{application:t,hwid:e,userId:s||e,device_type:i,device_model:a,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 i=t.match(/\bEdg\/(\d+)/);if(null!==i)return`Edge ${i[1]}`;let a=t.match(/(opera|chrome|safari|firefox(?=\/))\/?\s*(\d+)/i)||[];const[,r=""]=a;a=a[2]?[r,a[2]]:[navigator.appName,navigator.appVersion,"-?"];const n=t.match(/version\/([.\d]+)/i);return null!==n&&a.splice(1,1,n[1]),a.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),i=e.getKey("p256dh"),a=e.getKey("auth");if(!i||!a)throw new Error("Can't get subscription keys!");const r=btoa(String.fromCharCode.apply(String,new Uint8Array(i))),n=btoa(String.fromCharCode.apply(String,new Uint8Array(a)));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(),i=this.getPushToken(s),a=await this.data.getTokens(),r=i===(a&&a.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=${T()}`),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),i=new Uint8Array(s.length);for(let t=0;t<s.length;++t)i[t]=s.charCodeAt(t);return i}}class ht{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(),i=this.getPermission();return s!==i?(await this.data.setLastPermissionStatus(i),!0):e}getPermissionInfo(){return safari.pushNotification.permission(this.config.webSitePushId)}}class ut{constructor(){this.ready=!1,this.isPushDisabled=!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 at,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(M(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.isPushDisabled)throw new Error('Push notifications are disabled by the "pushNotifications" init param!');const e=this.requireDriver();if(e.checkIsPermissionDefault()){this.eventBus.dispatchEvent("show-notification-permission-dialog",{}),await e.askPermission();const t=e.getPermission();this.eventBus.dispatchEvent("hide-notification-permission-dialog",{permission:t})}const s=e.getPermission(),i=await this.data.getStatusManualUnsubscribed(),a=await this.api.checkDeviceSubscribeForPushNotifications(!1);if(s===n){this.eventBus.dispatchEvent("permission-granted",{});return(!a&&!i||t)&&await e.subscribe(),void this.eventBus.dispatchEvent("subscribe",{})}if("denied"===s)return this.eventBus.dispatchEvent("permission-denied",{}),void(a&&await e.unsubscribe())}async unsubscribe(){try{await this.requireDriver().unsubscribe()}catch(t){throw Y.error(t,"Error occurred during the unsubscribe"),t}}async forceSubscribe(){await this.subscribe(!0)}isDeviceRegistered(){return localStorage.getItem(i)===a}isDeviceUnregistered(){return localStorage.getItem(i)===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();const t=this.driver?.checkIsPermissionGranted();t&&(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}isPushAvailable(){return!!this.driver&&!this.isPushDisabled}requireDriver(){if(!this.driver)throw new Error("Push notifications are not available: the browser does not support them, or the application has no push configuration. Web popups, inbox, events and tags do not require it.");return this.driver}async sendStatisticsVisitedPage(){const{document:{title:t},location:{origin:e,pathname:s,href:i}}=window;await this.api.pageVisit({title:t,url_path:`${e}${s}`,url:i})}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.isPushDisabled=!1===t.pushNotifications,this.isAvailableNotifications()||Y.info("Pushwoosh: push notifications are not available in this browser, initializing without them"),!t.applicationCode)throw new Error("Can't find application code!");const s=!1===t.communicationEnabled,i=await this.data.getCommunicationEnabled(),a=await this.data.getStatusCommunicationDisabled();(s&&!0!==i||!1===i||a)&&(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.72.0"),this.isCommunicationDisabled)this.eventBus.dispatchEvent("communication-disabled",{});else{await this.finishInit();try{t.inboxWidget?.enable&&await this.api.ensureDeviceRegistered(),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(){if(await this.ensureHwid(),await this.data.setInitParams(this.initParams),await this.initStep("loadConfig",()=>this.loadConfig()),await this.initStep("applicationOpen",()=>this.open()),await this.initStep("sendData",()=>this.sendData()),this.isAvailableNotifications()){await this.data.getApplicationServerKey()?await this.initStep("initPushNotifications",()=>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 initStep(t,e){try{await e()}catch(e){Y.error(e,`Pushwoosh: init step "${t}" failed`)}}async ensureHwid(t=!1){await this.data.getHwid()&&!t||await this.data.setHwid(this.initParams.applicationCode+"_"+T())}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.requireDriver(),e=t.getPermission();"granted"===e&&await this.data.setLastPermissionStatus(e);const s=await this.data.getStatusCommunicationDisabled(),i=await this.data.getStatusDropAllData(),a=await t.checkIsNeedResubscribe();if(s||i)return void await this.unsubscribe();a&&(await this.unsubscribe(),await this.data.setStatusManualUnsubscribed(!1),await this.data.setIsVapidChanged(!1));const r=await this.data.getStatusManualUnsubscribed(),c=await this.api.checkDeviceSubscribeForPushNotifications(!1);switch(e){case o:this.eventBus.dispatchEvent("permission-default",{}),c&&await this.unsubscribe();break;case"denied":this.eventBus.dispatchEvent("permission-denied",{}),c&&await this.unsubscribe();break;case n:this.eventBus.dispatchEvent("permission-granted",{}),r&&c&&await this.unsubscribe(),(!c&&!r||a)&&await this.subscribe(!0)}}onServiceWorkerMessage(t){const{data:e={}}=t||{},{type:s="",payload:i={}}=e||{};this.emitLegacyEventsFromServiceWorker(s,i)}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){if(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.initDriver(),this.driver){if(this.isPushDisabled)return Y.info('Pushwoosh: push notifications are disabled by the "pushNotifications" init param'),void await this.warnAboutKeptSubscription();try{await this.defaultProcess()}catch(t){Y.error(t,"Internal error: defaultProcess fail")}}else Y.info("Pushwoosh: push service driver was not created, skipping push initialization")}async warnAboutKeptSubscription(){const{pushToken:t}=await this.data.getTokens();t&&Y.error('Pushwoosh: push notifications are disabled by the "pushNotifications" init param, but this device is still subscribed and will keep receiving notifications. Call Pushwoosh.unsubscribe() to unsubscribe it.')}async initDriver(){if(this.platformChecker.isSafari&&!this.initParams.unifiedPlatform){const{safariWebsitePushID:t}=await this.data.getInitParams();return t?void(this.driver=new ht(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=>{const{prop:i}=_[t];e(this.api,i?s[i]:void 0)});break;default:s=!1}return s}emitLegacyEventsFromServiceWorker(t,e){switch(t){case w:this.eventBus.dispatchEvent("receive-push",{notification:e});break;case b:this.eventBus.dispatchEvent("open-notification",{notification:e});break;case v:this.eventBus.dispatchEvent("hide-notification",{notification:e});break;case f:this.eventBus.dispatchEvent("receive-inbox-message",{message:e})}}}return e})());
|
|
1
|
+
!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 i in s)("object"==typeof exports?exports:t)[i]=s[i]}}(this,()=>(()=>{"use strict";const t={d:(e,s)=>{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=>{Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}};let e={};t.r(e),t.d(e,{Pushwoosh:()=>lt});const s="/pushwoosh-service-worker.js",i="deviceRegistrationStatus",a="registered",r="unregistered",n="granted",o="default",c="onReady",h="onSubscribe",u="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",I="onShowSubscriptionWidget",k="onHideSubscriptionWidget",D="PW_SiteOpened",E="Pushwoosh: the SDK storage does not keep the hwid in this browser (in-app webview, private window or insecure context), so this device cannot be identified. Requests that need an hwid are not sent.",x=[210],_={autoSubscribe:!0,serviceWorkerUrl:s};function T(){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 W=t=>"function"==typeof t,A={[d]:{name:"register"},[h]:{name:"subscribe"},[u]:{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"},[I]:{name:"show-subscription-widget"},[k]:{name:"hide-subscription-widget"},[l]:{name:"permission-denied"},[g]:{name:"permission-default"},[p]:{name:"permission-granted"}},R="keyValue",N="messages",q="inboxMessages";function O(t,e){return function(s){s.objectStoreNames.contains(t)||e(s)}}const L=[O(R,function(t){t.createObjectStore(R,{keyPath:"key"})}),O("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})}),O(N,function(t){t.createObjectStore(N,{keyPath:"id",autoIncrement:!0}).createIndex("date","date",{unique:!1})}),O(q,function(t){const e="status",s=t.createObjectStore(q,{keyPath:"inbox_id",autoIncrement:!1});s.createIndex(e,e,{unique:!1,multiEntry:!0}),s.createIndex("rt","rt",{unique:!1,multiEntry:!0})})];class U{get all(){return L}}class B{constructor(t,e=new U){this.db=t,this.migrationsBuilder=e}applyMigrations(){this.applyMigrationsPack(this.migrationsBuilder.all)}applyMigrationsPack(t){t.forEach(t=>{t(this.db)})}}function F(t,e){console.info("onversionchange",e),t.close()}let V;function j(){return V||(V=new Promise((t,e)=>{const s=indexedDB.open("PUSHWOOSH_SDK_STORE",7);s.onsuccess=s=>{const i=s.target.result;i.onversionchange=F.bind(null,i,e),t(i)},s.onerror=()=>e(s.error),s.onupgradeneeded=t=>{const s=t.target.result;s.onversionchange=F.bind(null,s,e);new B(s).applyMigrations()}})),V}function H(t){return j().then(e=>new Promise((s,i)=>t(e,s,i)))}class ${_add(t){return H((e,s,i)=>{const a=e.transaction([this.name],"readwrite").objectStore(this.name).add(t);a.onsuccess=()=>{s(t)},a.onerror=()=>{i(a.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 H((e,s,i)=>{const a=e.transaction([this.name],"readwrite").objectStore(this.name).delete(t);a.onsuccess=()=>{s(a.result)},a.onerror=()=>{i(a.error)}})}getAll(){return H((t,e,s)=>{const i=[],a=t.transaction(this.name).objectStore(this.name).openCursor();a.onsuccess=t=>{const s=t.target.result;s?(s.value&&i.push(s.value),s.continue()):e(i)},a.onerror=()=>{s(a.error)}})}}const K=(z=R,{get:(t,e)=>H((s,i,a)=>{const r=s.transaction(z).objectStore(z).get(t);let n,o=!1,c=!1;const h=()=>{clearTimeout(n),o?i(r.result?.value||e):c?a(r.error):n=setTimeout(h,0)};r.onsuccess=()=>o=!0,r.onerror=()=>c=!0,h()}),getAll:()=>H((t,e,s)=>{const i={},a=t.transaction(z).objectStore(z).openCursor();let r,n=!1,o=!1;const c=()=>{clearTimeout(r),n?e(i):o?s(a.error):r=setTimeout(c,0)};a.onsuccess=t=>{const e=t.target.result;e?(i[e.key]=e.value.value,e.continue()):n=!0},a.onerror=()=>o=!0,c()}),async extend(t,e){const s=await this.get(t),{...i}=e;await this.set(t,{...s,...i})},set:(t,e)=>H((s,i,a)=>{const r=s.transaction([z],"readwrite").objectStore(z).put({key:t,value:e});let n,o=!1,c=!1;const h=()=>{clearTimeout(n),o?i(t):c?a(r.error):n=setTimeout(h,0)};r.onsuccess=()=>o=!0,r.onerror=()=>c=!0,h()})});var z;const G=new class extends ${constructor(){super(...arguments),this.name="log",this.maxItems=100,this.environment="undefined"!=typeof self&&self.registration?"worker":"browser"}add(t,e,s){const i={type:t,environment:this.environment,message:`${e}`,date:new Date};return e instanceof Error&&(i.stack=e.stack),s&&(i.additional=s),this._add(i)}},J=new class extends ${constructor(){super(...arguments),this.name=N,this.maxItems=25}add(t){return this._add({...t,date:new Date})}},Y={error:1,info:2,debug:3};let Q=3;const X={setLevel(t){Y[t]||(t="error"),Q=Y[t]},write(t,e,s){return"error"===t?this.error(e):this.info(e),G.add(t,e,s)}};Object.keys(Y).forEach(t=>{const e=Y[t];X[t]=(...s)=>{e<=Q&&(console.groupCollapsed(t),console.info("",...s),console.trace("trace"),console.groupEnd())}});class Z{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(),i=this.handlers[t];return i?(i.forEach(t=>{W(t)&&setTimeout(()=>{t({...e,eventId:s})},0)}),s):s},this.handlers={}}}class tt{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 et{constructor(t,e,s,i=new tt){this.data=t,this.api=e,this.inboxModel=s,this.dateModule=i,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 i=[],a=[];e.forEach(async e=>{-1!==t.indexOf(e.inbox_id)&&(e.status=s,i.push(e),a.push(this.api.inboxStatus(e.order,e.status)))}),await this.inboxModel.putBulkMessages(i),await Promise.all(a)}async publicMessageBuilder({action_type:t,action_params:e,image:s,title:i,send_date:a,inbox_id:r,text:n,status:o}){const c=s||await this.data.getDefaultNotificationImage(),h=i||await this.data.getDefaultNotificationTitle(),u=JSON.parse(e);return this.dateModule.date=new Date(1e3*parseInt(a)),this.dateModule.setLocal(),{title:h,imageUrl:c,code:r,message:n,sendDate:this.dateModule.date.toISOString(),type:this.messageTypeFactory(t,u),link:u?.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),i=this.messageTypeFactory(e.action_type,s);2===i&&null!=s.l?document.location.href=s.l:3===i&&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.api.ensureDeviceRegistered(),await this.inboxModel.updateMessages()}}class st{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,i)=>{t.onsuccess=()=>{s(e)},t.onerror=()=>{i(t.error)}})}readRequestPromise(t,e){return new Promise((s,i)=>{t.onsuccess=t=>{const i=t.target;s(i.result||e)},t.onerror=()=>{i(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,i)=>{t.onsuccess=t=>{const i=t.target.result;i?(e.push(i.value),i.continue()):s(e)},t.onerror=()=>{i(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 it{getDB(){return j()}async put(t,e,s){const i=await this.getDB();return new st(i,t).put(e,s)}async delete(t,e){const s=await this.getDB();return new st(s,t).delete(e)}async get(t,e,s){const i=await this.getDB();return new st(i,t).get(e,s)}async getAll(t){const e=await this.getDB(),s=new st(e,t);return await s.getAll()||[]}async count(t,e){const s=await this.getDB();return new st(s,t).count(e)}async countByIndex(t,e,s){const i=await this.getDB(),a=new st(i,t);return a.index=e,a.countByIndex(s)}}class at{constructor(t,e,s,i=new it,a=new tt){this.eventBus=t,this.data=e,this.api=s,this.storage=i,this.storeName="inboxMessages",this.dateModule=a}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 et(this.data,this.api,this)})}}class rt extends Error{constructor(t,e){super(t),this.name="ApiRequestError",this.statusCode=e}}const nt=t=>`params.${t}`;class ot{constructor(t=K){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(nt(e),void 0)}async setApplicationCode(t){await this.store.set(nt("applicationCode"),t)}async getApplicationCode(){return this.store.get(nt("applicationCode"))}async setApiToken(t){return await this.store.set(nt("apiToken"),t)}async getApiToken(){return this.store.get(nt("apiToken"))}async setHwid(t){await this.store.set(nt("hwid"),t)}async getHwid(){return this.store.get(nt("hwid"))}async setDeviceType(t){await this.store.set(nt("deviceType"),t)}async getDeviceType(){return this.store.get(nt("deviceType"))}async setFormFactor(t){await this.store.set(nt("formFactor"),t)}async getFormFactor(){return this.store.get(nt("formFactor"))}async setDeviceModel(t){await this.store.set(nt("deviceModel"),t)}async getDeviceModel(){return this.store.get(nt("deviceModel"))}async setLanguage(t){await this.store.set(nt("language"),t)}async getLanguage(){return this.store.get(nt("language"),"en")}async setStatusLanguageWasChanged(t){await this.store.set(nt("languageWasChanged"),t)}async getStatusLanguageWasChanged(){return this.store.get(nt("languageWasChanged"),!1)}async setApiEntrypoint(t){await this.store.set(nt("apiEntrypoint"),t)}async getApiEntrypoint(){return this.store.get(nt("apiEntrypoint"),"https://api.pushwoosh.com/json/1.3/")}async setTokens(t){await this.store.set(nt("tokens"),t)}getTokens(){return this.store.get(nt("tokens"))}async setApplicationServerKey(t){await this.store.set(nt("applicationServerKey"),t)}async getApplicationServerKey(){return this.store.get(nt("applicationServerKey"))}async setIsVapidChanged(t){await this.store.set(nt("isVapidChanged"),t)}async getIsVapidChanged(){return this.store.get(nt("isVapidChanged"),!1)}async setWebSitePushId(t){await this.store.set(nt("webSitePushId"),t)}async getWebSitePushId(){return this.store.get(nt("webSitePushId"))}async setDefaultNotificationImage(t){await this.store.set(nt("defaultNotificationImage"),t)}async getDefaultNotificationImage(){return this.store.get(nt("defaultNotificationImage"),"https://cp.pushwoosh.com/img/logo-medium.png")}async setDefaultNotificationTitle(t){await this.store.set(nt("defaultNotificationTitle"),t)}async getDefaultNotificationTitle(){return this.store.get(nt("defaultNotificationTitle"),"Pushwoosh notification")}async setUserId(t){await this.store.set(nt("userId"),t?`${t}`:void 0)}async getUserId(){return this.store.get(nt("userId"))}async setStatusUserIdWasChanged(t){await this.store.set(nt("userIdWasChanged"),t)}async getStatusUserIdWasChanged(){return this.store.get(nt("userIdWasChanged"),!1)}async setEmail(t){await this.store.set(nt("email"),t?`${t}`:void 0)}async getEmail(){return this.store.get(nt("email"))}async setStatusEmailWasChanged(t){await this.store.set(nt("emailWasChanged"),t)}async getStatusEmailWasChanged(){return this.store.get(nt("emailWasChanged"),!1)}async setSmsNumber(t){await this.store.set(nt("smsNumber"),t?`${t}`:void 0)}async getSmsNumber(){return this.store.get(nt("smsNumber"))}async setStatusSmsNumberWasChanged(t){await this.store.set(nt("smsNumberWasChanged"),t)}async getStatusSmsNumberWasChanged(){return this.store.get(nt("smsNumberWasChanged"),!1)}async setWhatsAppNumber(t){await this.store.set(nt("whatsAppNumber"),t?`${t}`:void 0)}async getWhatsAppNumber(){return this.store.get(nt("whatsAppNumber"))}async setStatusWhatsAppNumberWasChanged(t){await this.store.set(nt("whatsAppNumberWasChanged"),t)}async getStatusWhatsAppNumberWasChanged(){return this.store.get(nt("whatsAppNumberWasChanged"),!1)}async setLastPermissionStatus(t){await this.store.set(nt("isLastPermissionStatus"),t)}async getLastPermissionStatus(){return this.store.get(nt("isLastPermissionStatus"))}async setStatusManualUnsubscribed(t){await this.store.set(nt("isManualUnsubscribed"),t)}getStatusManualUnsubscribed(){return this.store.get(nt("isManualUnsubscribed"),!1)}async setStatusCommunicationDisabled(t){await this.store.set(nt("isCommunicationDisabled"),t)}getStatusCommunicationDisabled(){return this.store.get(nt("isCommunicationDisabled"),!1)}async setCommunicationEnabled(t){await this.store.set(nt("communicationEnabled"),t)}getCommunicationEnabled(){return this.store.get(nt("communicationEnabled"))}async setStatusDropAllData(t){await this.store.set(nt("isDropAllData"),t)}getStatusDropAllData(){return this.store.get(nt("isDropAllData"),!1)}async setSdkVersion(t){await this.store.set(nt("sdkVersion"),t)}async getSdkVersion(){return this.store.get(nt("sdkVersion"))}async setServiceWorkerVersion(t){await this.store.set(nt("serviceWorkerVersion"),t)}getServiceWorkerVersion(){return this.store.get(nt("serviceWorkerVersion"))}async setServiceWorkerUrl(t){t&&await this.store.set(nt("serviceWorkerUrl"),t)}async getServiceWorkerUrl(){return this.store.get(nt("serviceWorkerUrl"),s)}async setServiceWorkerScope(t){t&&await this.store.set(nt("serviceWorkerScope"),t)}async getServiceWorkerScope(){return this.store.get(nt("serviceWorkerScope"))}async setLastOpenMessage(t){await this.store.set(nt("lastOpenMessage"),t)}getLastOpenMessage(){return this.store.get(nt("lastOpenMessage"))}async setLastOpenApplicationTime(t){await this.store.set(nt("lastOpenApplicationTime"),t)}async getLastOpenApplicationTime(){return this.store.get(nt("lastOpenApplicationTime"))}async setFeatures(t){await this.store.set(nt("features"),t)}async getFeatures(){return this.store.get(nt("features"))}async setInitParams(t){await this.store.set(nt("init"),t)}async getInitParams(){return this.store.get(nt("init"))}async setInboxLastRequestCode(t){await this.store.set(nt("inbox.lastRequestCode"),t)}async getInboxLastRequestCode(){return this.store.get(nt("inbox.lastRequestCode"),"")}async setInboxLastRequestTime(t){await this.store.set(nt("inbox.lastRequestTime"),t)}async getInboxLastRequestTime(){return this.store.get(nt("inbox.lastRequestTime"),0)}async setInboxNewMessagesCount(t){await this.store.set(nt("inbox.newMessagesCount"),t)}async getInboxNewMessagesCount(){return this.store.get(nt("inbox.newMessagesCount"),0)}async setDelayedEvent(t){await this.store.set(nt("delayedEvent"),t)}getDelayedEvent(){return this.store.get(nt("delayedEvent"))}async setPromptDisplayCount(t){await this.store.set(nt("promptDisplayCount"),t)}async getPromptDisplayCount(){return this.store.get(nt("promptDisplayCount"),0)}async setPromptLastSeenTime(t){await this.store.set(nt("promptLastSeenTime"),t)}async getPromptLastSeenTime(){return this.store.get(nt("promptLastSeenTime"),0)}async setLogLevel(t){await this.store.set(nt("logLevel"),t)}async getLogLevel(){return this.store.get(nt("logLevel"),"error")}async getShownWebPopups(){return this.store.get(nt("shownWebPopups"),[])}async addShownWebPopup(t){const e=await this.getShownWebPopups();e.includes(t)||(e.push(t),await this.store.set(nt("shownWebPopups"),e))}async setIsRecurringVisitor(t){await this.store.set(nt("isRecurringVisitor"),t)}async getIsRecurringVisitor(){return this.store.get(nt("isRecurringVisitor"),!1)}}class ct{constructor(t=new ot,e=X){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 i=await this.data.getApiEntrypoint(),a=await this.data.getApiToken(),r=s||i+t,n=a?{headers:{Authorization:`Token ${a}`,"Content-Type":"text/plain;charset=UTF-8",Origin:T().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,s=`status: ${t.status}. statusText: ${t.statusText}.`;try{const i=await t.json();i&&"number"==typeof i.status_code&&(e=i.status_code),i&&i.status_message&&(s+=` status_code: ${i.status_code}. status_message: ${i.status_message}.`)}catch(t){}throw new rt(s,e)}const e=await t.json();if(200!==e.status_code)throw new rt(`Error code: ${e.status_code}. Error text: ${e.status_message}`,"number"==typeof e.status_code?e.status_code:void 0);return e}}class ht{constructor(t,e=new ot,s=new ct,i=()=>!1,a=()=>{}){this.ensureDeviceRegisteredPromise=null,this.eventBus=t,this.data=e,this.apiClient=s,this.getIsCommunicationDisabled=i,this.getInitUserId=a}async checkDevice(){const t=await this.getRequestParams();return await this.apiClient.checkDevice(t)}async checkDeviceSubscribeForPushNotifications(t=!0){let e=localStorage.getItem(i);if(void 0===e||!t){const{exist:t,push_token_exist:s}=await this.checkDevice();localStorage.setItem(i,t&&s?a:r),e=localStorage.getItem(i)}return e===a}async ensureDeviceRegistered(){return!this.getIsCommunicationDisabled()&&(this.ensureDeviceRegisteredPromise||(this.ensureDeviceRegisteredPromise=this.registerDeviceIfNotExist().catch(t=>{throw this.ensureDeviceRegisteredPromise=null,t})),this.ensureDeviceRegisteredPromise)}async registerDeviceIfNotExist(){const{exist:t}=await this.checkDevice();return!t&&(await this.apiClient.registerDevice(await this.getRequestParams()),!0)}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(i,a),this.eventBus.dispatchEvent("register",{}),s}async unregisterDevice(){const t=await this.getRequestParams(),e=await this.apiClient.unregisterDevice(t);return localStorage.setItem(i,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(i,r),this.eventBus.dispatchEvent("unsubscribe",{}),e}async messageDeliveryEvent(t,e,s={}){const i=await this.getRequestParams();return await this.apiClient.messageDeliveryEvent({...i,hash:t,metaData:s})}async pushStat(t,e,s={}){const i=await this.getRequestParams();return await this.apiClient.pushStat({...i,hash:t,metaData:s})}async setTags(t){if(this.getIsCommunicationDisabled())return Promise.reject(new Error("Communication is disabled"));const{hwid:e,device_type:s,...i}=await this.getRequestParams(),a=await this.data.getEmail();return a&&await this.apiClient.setEmailTags({...i,email:a,tags:t}),this.apiClient.setTags({...i,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:i,...a}=await this.getRequestParams(),r=await this.data.getDeviceType(),n=`${t}`,o=await this.apiClient.registerUser({...a,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 s=await this.getIdentityRequestParams(),i=await this.apiClient.registerEmail({...s,email:t,ts_offset:60*-(new Date).getTimezoneOffset()});return await this.data.setEmail(t),e&&await this.data.setStatusEmailWasChanged(!0),i}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:i}=await this.getIdentityRequestParams(),a=await this.apiClient.registerDevice({application:s,userId:i,hwid:t,device_type:18});return await this.data.setSmsNumber(t),e&&await this.data.setStatusSmsNumberWasChanged(!0),a}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:i}=await this.getIdentityRequestParams(),a=await this.apiClient.registerDevice({application:s,userId:i,hwid:t,device_type:21});return await this.data.setWhatsAppNumber(t),e&&await this.data.setStatusWhatsAppNumberWasChanged(!0),a}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(),i=new Date,a=i.getTime(),r=Math.floor(a/1e3),n=r-i.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(),i=await this.data.getInboxLastRequestTime();return this.apiClient.getInboxMessages({...e,count:t,last_code:s,last_request_time:i})}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(),i=s&&s.page_visit&&s.page_visit.entrypoint;if(i)return this.apiClient.pageVisit({...e,...t},i)}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(),h=await this.data.getHwid();!t.push_devices&&c.pushToken&&await this.requireHwid();const u={application:e,...t};if(t.user_id){u.user_id=String(t.user_id);await this.data.getUserId()!==u.user_id&&(await this.data.setUserId(u.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(u.language?(await this.data.setLanguage(u.language),await this.data.setStatusLanguageWasChanged(!0)):u.language=n,!u.timezone){const t=60*-(new Date).getTimezoneOffset();u.timezone=String(t)}if(!u.push_devices&&c.pushToken){const t={hwid:h,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}u.push_devices=[t]}const d=await this.apiClient.multiRegisterDevice(u);return u.push_devices?.length&&(await this.data.setStatusManualUnsubscribed(!1),localStorage.setItem(i,a),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.requireHwid(),e=await this.data.getDeviceType();return{...await this.getIdentityRequestParams(),hwid:t,device_type:e}}async getIdentityRequestParams(){const t=await this.data.getApplicationCode(),e=await this.data.getHwid(),s=await this.data.getUserId()||this.getInitUserId(),i=await this.data.getDeviceModel(),a=await this.data.getLanguage(),r=await this.data.getSdkVersion(),n=60*-(new Date).getTimezoneOffset();if(!s&&!e)throw new Error("Pushwoosh: neither a userId nor an hwid is available, so there is nothing to register the email, SMS or WhatsApp channel to. Pass a userId in the init params.");return{application:t,userId:s||e,device_model:i,timezone:n,language:a,v:r}}async requireHwid(){const t=await this.data.getHwid();if(!t)throw new Error(E);return t}}class ut{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 i=t.match(/\bEdg\/(\d+)/);if(null!==i)return`Edge ${i[1]}`;let a=t.match(/(opera|chrome|safari|firefox(?=\/))\/?\s*(\d+)/i)||[];const[,r=""]=a;a=a[2]?[r,a[2]]:[navigator.appName,navigator.appVersion,"-?"];const n=t.match(/version\/([.\d]+)/i);return null!==n&&a.splice(1,1,n[1]),a.join(" ")}}class dt{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 X.error("You must have permission granted before subscribe!");const s=this.getPushToken(e),i=e.getKey("p256dh"),a=e.getKey("auth");if(!i||!a)throw new Error("Can't get subscription keys!");const r=btoa(String.fromCharCode.apply(String,new Uint8Array(i))),n=btoa(String.fromCharCode.apply(String,new Uint8Array(a)));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(),i=this.getPushToken(s),a=await this.data.getTokens(),r=i===(a&&a.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),i=new Uint8Array(s.length);for(let t=0;t<s.length;++t)i[t]=s.charCodeAt(t);return i}}class gt{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 X.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(),i=this.getPermission();return s!==i?(await this.data.setLastPermissionStatus(i),!0):e}getPermissionInfo(){return safari.pushNotification.permission(this.config.webSitePushId)}}class lt{constructor(){this.ready=!1,this.isPushDisabled=!1,this.isInitAborted=!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 G.getAll();console.log(t)},async showKeyValues(){const t=await K.getAll();console.log(t)},async showMessages(){(await J.getAll()).forEach(t=>console.log(t))}},this.eventBus=new Z,this.data=new ot,this.apiClient=new ct(this.data),this.api=new ht(this.eventBus,this.data,this.apiClient,()=>this.isCommunicationDisabled,()=>this.getInitUserId()),this.platformChecker=new ut(T()),this.inboxModel=new at(this.eventBus,this.data,this.api),this.pwinbox=new et(this.data,this.api,this.inboxModel)}push(t){if(W(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.isPushDisabled)throw new Error('Push notifications are disabled by the "pushNotifications" init param!');const e=this.requireDriver();if(e.checkIsPermissionDefault()){this.eventBus.dispatchEvent("show-notification-permission-dialog",{}),await e.askPermission();const t=e.getPermission();this.eventBus.dispatchEvent("hide-notification-permission-dialog",{permission:t})}const s=e.getPermission(),i=await this.data.getStatusManualUnsubscribed(),a=await this.api.checkDeviceSubscribeForPushNotifications(!1);if(s===n){this.eventBus.dispatchEvent("permission-granted",{});return(!a&&!i||t)&&await e.subscribe(),void this.eventBus.dispatchEvent("subscribe",{})}if("denied"===s)return this.eventBus.dispatchEvent("permission-denied",{}),void(a&&await e.unsubscribe())}async unsubscribe(){try{await this.requireDriver().unsubscribe()}catch(t){throw X.error(t,"Error occurred during the unsubscribe"),t}}async forceSubscribe(){await this.subscribe(!0)}isDeviceRegistered(){return localStorage.getItem(i)===a}isDeviceUnregistered(){return localStorage.getItem(i)===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();const t=this.driver?.checkIsPermissionGranted();t&&(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}isPushAvailable(){return!!this.driver&&!this.isPushDisabled}requireDriver(){if(!this.driver)throw new Error("Push notifications are not available: the browser does not support them, or the application has no push configuration. Web popups, inbox, events and tags do not require it.");return this.driver}async sendStatisticsVisitedPage(){const{document:{title:t},location:{origin:e,pathname:s,href:i}}=window;await this.api.pageVisit({title:t,url_path:`${e}${s}`,url:i})}async initialize(t){this.initParams={..._,...t},this.isInitAborted=!1;const e=localStorage.getItem("PW_SET_LOGGER_LEVEL");if(X.setLevel(e||t.logLevel||"error"),t.logLevel&&await this.data.setLogLevel(t.logLevel),this.isPushDisabled=!1===t.pushNotifications,this.isAvailableNotifications()||X.info("Pushwoosh: push notifications are not available in this browser, initializing without them"),!t.applicationCode)throw new Error("Can't find application code!");const s=!1===t.communicationEnabled,i=await this.data.getCommunicationEnabled(),a=await this.data.getStatusCommunicationDisabled();(s&&!0!==i||!1===i||a)&&(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.74.0"),this.isCommunicationDisabled)this.eventBus.dispatchEvent("communication-disabled",{});else{if(await this.finishInit(),this.isInitAborted)return;try{t.inboxWidget?.enable&&await this.api.ensureDeviceRegistered(),await this.inboxModel.updateMessages()}catch(t){X.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(){if(await this.ensureHwid(),await this.data.setInitParams(this.initParams),await this.initStep("loadConfig",()=>this.loadConfig()),await this.initStep("applicationOpen",()=>this.open()),await this.initStep("sendData",()=>this.sendData()),!this.isInitAborted){if(this.isAvailableNotifications()){await this.data.getApplicationServerKey()?await this.initStep("initPushNotifications",()=>this.initPushNotifications(this.initParams)):X.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 initStep(t,e){if(!this.isInitAborted)try{await e()}catch(e){const s=function(t){const e=t?.statusCode;return"number"==typeof e?e:void 0}(e);if(void 0!==s&&-1!==x.indexOf(s))return void this.abortInit(s);X.error(e,`Pushwoosh: init step "${t}" failed`)}}abortInit(t){this.isInitAborted=!0,X.error(`Pushwoosh: initialization stopped. The Pushwoosh API rejected the application code "${this.initParams.applicationCode}" (status_code: ${t}). Check the applicationCode init param against the application in your Pushwoosh Control Panel.`)}async ensureHwid(t=!1){if(await this.readHwid()&&!t)return;const e=this.initParams.applicationCode+"_"+M();try{await this.data.setHwid(e),await this.data.getHwid()!==e&&X.info(E)}catch(t){X.info(t,E)}}async readHwid(){try{return await this.data.getHwid()}catch{return""}}getInitUserId(){const{userId:t}=this.initParams||{};return t&&"user_id"!==t?t:void 0}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.requireDriver(),e=t.getPermission();"granted"===e&&await this.data.setLastPermissionStatus(e);const s=await this.data.getStatusCommunicationDisabled(),i=await this.data.getStatusDropAllData(),a=await t.checkIsNeedResubscribe();if(s||i)return void await this.unsubscribe();a&&(await this.unsubscribe(),await this.data.setStatusManualUnsubscribed(!1),await this.data.setIsVapidChanged(!1));const r=await this.data.getStatusManualUnsubscribed(),c=await this.api.checkDeviceSubscribeForPushNotifications(!1);switch(e){case o:this.eventBus.dispatchEvent("permission-default",{}),c&&await this.unsubscribe();break;case"denied":this.eventBus.dispatchEvent("permission-denied",{}),c&&await this.unsubscribe();break;case n:this.eventBus.dispatchEvent("permission-granted",{}),r&&c&&await this.unsubscribe(),(!c&&!r||a)&&await this.subscribe(!0)}}onServiceWorkerMessage(t){const{data:e={}}=t||{},{type:s="",payload:i={}}=e||{};this.emitLegacyEventsFromServiceWorker(s,i)}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();if(t.userId&&"user_id"!==t.userId&&t.userId!==e)try{await this.api.registerUser(t.userId,!1)}catch(t){X.error(t,"Pushwoosh: registerUser failed")}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 K.set("PAGE_VISITED_URL",e.page_visit.entrypoint),this.sendStatisticsVisitedPage()),e.events&&e.events.length){e.events.some(t=>t===D)&&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){if(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.initDriver(),this.driver){if(this.isPushDisabled)return X.info('Pushwoosh: push notifications are disabled by the "pushNotifications" init param'),void await this.warnAboutKeptSubscription();try{await this.defaultProcess()}catch(t){X.error(t,"Internal error: defaultProcess fail")}}else X.info("Pushwoosh: push service driver was not created, skipping push initialization")}async warnAboutKeptSubscription(){const{pushToken:t}=await this.data.getTokens();t&&X.error('Pushwoosh: push notifications are disabled by the "pushNotifications" init param, but this device is still subscribed and will keep receiving notifications. Call Pushwoosh.unsubscribe() to unsubscribe it.')}async initDriver(){if(this.platformChecker.isSafari&&!this.initParams.unifiedPlatform){const{safariWebsitePushID:t}=await this.data.getInitParams();return t?void(this.driver=new gt(this.api,this.data,{webSitePushId:t})):void X.info("For work with Safari Push Notification add safariWebsitePushID to initParams!")}X.info({isAvailableServiceWorker:this.platformChecker.isAvailableServiceWorker}),this.platformChecker.isAvailableServiceWorker&&(this.driver=new dt(this.api,this.data,{}))}async sendPostEventVisitedPage(){const{document:{title:t},location:{href:e}}=window,s=await this.data.getDeviceType();this.api.postEvent(D,{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 A:this.eventBus.addEventHandler(A[t].name,s=>{const{prop:i}=A[t];e(this.api,i?s[i]:void 0)});break;default:s=!1}return s}emitLegacyEventsFromServiceWorker(t,e){switch(t){case w:this.eventBus.dispatchEvent("receive-push",{notification:e});break;case b:this.eventBus.dispatchEvent("open-notification",{notification:e});break;case v:this.eventBus.dispatchEvent("hide-notification",{notification:e});break;case f:this.eventBus.dispatchEvent("receive-inbox-message",{message:e})}}}return e})());
|
|
2
2
|
//# sourceMappingURL=npm.js.map
|