UNPKG

pubnub

Version:

Publish & Subscribe Real-time Messaging with PubNub

2 lines 56 kB
!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){"use strict";var e,t,s,n;!function(e){e.Unregister="unregister",e.Disconnect="disconnect",e.IdentityChange="identityChange",e.AuthChange="authChange",e.HeartbeatIntervalChange="heartbeatIntervalChange",e.PresenceStateChange="presenceStateChange",e.SendSubscribeRequest="sendSubscribeRequest",e.CancelSubscribeRequest="cancelSubscribeRequest",e.SendHeartbeatRequest="sendHeartbeatRequest",e.SendLeaveRequest="sendLeaveRequest"}(e||(e={}));class i extends CustomEvent{get client(){return this.detail.client}}class r extends i{constructor(t){super(e.Unregister,{detail:{client:t}})}clone(){return new r(this.client)}}class a extends i{constructor(t){super(e.Disconnect,{detail:{client:t}})}clone(){return new a(this.client)}}class o extends i{constructor(t,s,n){super(e.IdentityChange,{detail:{client:t,oldUserId:s,newUserId:n}})}get oldUserId(){return this.detail.oldUserId}get newUserId(){return this.detail.newUserId}clone(){return new o(this.client,this.oldUserId,this.newUserId)}}class c extends i{constructor(t,s,n){super(e.AuthChange,{detail:{client:t,oldAuth:n,newAuth:s}})}get oldAuth(){return this.detail.oldAuth}get newAuth(){return this.detail.newAuth}clone(){return new c(this.client,this.newAuth,this.oldAuth)}}class l extends i{constructor(t,s,n){super(e.HeartbeatIntervalChange,{detail:{client:t,oldInterval:n,newInterval:s}})}get oldInterval(){return this.detail.oldInterval}get newInterval(){return this.detail.newInterval}clone(){return new l(this.client,this.newInterval,this.oldInterval)}}class h extends i{constructor(t,s){super(e.PresenceStateChange,{detail:{client:t,state:s}})}get state(){return this.detail.state}clone(){return new h(this.client,this.state)}}class u extends i{constructor(t,s){super(e.SendSubscribeRequest,{detail:{client:t,request:s}})}get request(){return this.detail.request}clone(){return new u(this.client,this.request)}}class d extends i{constructor(t,s){super(e.CancelSubscribeRequest,{detail:{client:t,request:s}})}get request(){return this.detail.request}clone(){return new d(this.client,this.request)}}class g extends i{constructor(t,s){super(e.SendHeartbeatRequest,{detail:{client:t,request:s}})}get request(){return this.detail.request}clone(){return new g(this.client,this.request)}}class p extends i{constructor(t,s){super(e.SendLeaveRequest,{detail:{client:t,request:s}})}get request(){return this.detail.request}clone(){return new p(this.client,this.request)}}!function(e){e.Registered="Registered",e.Unregistered="Unregistered"}(t||(t={}));class f extends CustomEvent{constructor(e){super(t.Registered,{detail:e})}get client(){return this.detail}clone(){return new f(this.client)}}class q extends CustomEvent{constructor(e,s=!1){super(t.Unregistered,{detail:{client:e,withLeave:s}})}get client(){return this.detail.client}get withLeave(){return this.detail.withLeave}clone(){return new q(this.client,this.withLeave)}}!function(e){e.Changed="changed",e.Invalidated="invalidated"}(s||(s={}));class v extends CustomEvent{constructor(e,t,n,i){super(s.Changed,{detail:{withInitialResponse:e,newRequests:t,canceledRequests:n,leaveRequest:i}})}get requestsWithInitialResponse(){return this.detail.withInitialResponse}get newRequests(){return this.detail.newRequests}get leaveRequest(){return this.detail.leaveRequest}get canceledRequests(){return this.detail.canceledRequests}clone(){return new v(this.requestsWithInitialResponse,this.newRequests,this.canceledRequests,this.leaveRequest)}}class m extends CustomEvent{constructor(){super(s.Invalidated)}clone(){return new m}}!function(e){e.Started="started",e.Canceled="canceled",e.Success="success",e.Error="error"}(n||(n={}));class b extends CustomEvent{get request(){return this.detail.request}}class S extends b{constructor(e){super(n.Started,{detail:{request:e}})}clone(e){return new S(null!=e?e:this.request)}}class C extends b{constructor(e,t,s){super(n.Success,{detail:{request:e,fetchRequest:t,response:s}})}get fetchRequest(){return this.detail.fetchRequest}get response(){return this.detail.response}clone(e){return new C(null!=e?e:this.request,e?e.asFetchRequest:this.fetchRequest,this.response)}}class R extends b{constructor(e,t,s){super(n.Error,{detail:{request:e,fetchRequest:t,error:s}})}get fetchRequest(){return this.detail.fetchRequest}get error(){return this.detail.error}clone(e){return new R(null!=e?e:this.request,e?e.asFetchRequest:this.fetchRequest,this.error)}}class E extends b{constructor(e){super(n.Canceled,{detail:{request:e}})}clone(e){return new E(null!=e?e:this.request)}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function y(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var T,w,k={exports:{}}; /*! lil-uuid - v0.1 - MIT License - https://github.com/lil-js/uuid */T=k,function(e){var t="0.1.0",s={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i};function n(){var e,t,s="";for(e=0;e<32;e++)t=16*Math.random()|0,8!==e&&12!==e&&16!==e&&20!==e||(s+="-"),s+=(12===e?4:16===e?3&t|8:t).toString(16);return s}function i(e,t){var n=s[t||"all"];return n&&n.test(e)||!1}n.isUUID=i,n.VERSION=t,e.uuid=n,e.isUUID=i}(w=k.exports),null!==T&&(T.exports=w.uuid);var I,A=y(k.exports),O={createUUID:()=>A.uuid?A.uuid():A()};class P extends EventTarget{constructor(e,t,s,n,i,r){super(),this.request=e,this.subscribeKey=t,this.channels=n,this.channelGroups=i,this.dependents={},this._completed=!1,this._canceled=!1,this.queryStringFromObject=e=>Object.keys(e).map((t=>{const s=e[t];return Array.isArray(s)?s.map((e=>`${t}=${this.encodeString(e)}`)).join("&"):`${t}=${this.encodeString(s)}`})).join("&"),this._accessToken=r,this._userId=s}get identifier(){return this.request.identifier}get origin(){return this.request.origin}get userId(){return this._userId}set userId(e){this._userId=e,this.request.queryParameters.uuid=e}get accessToken(){return this._accessToken}set accessToken(e){this._accessToken=e,e?this.request.queryParameters.auth=e.toString():delete this.request.queryParameters.auth}get client(){return this._client}set client(e){this._client=e}get completed(){return this._completed}get cancellable(){return this.request.cancellable}get canceled(){return this._canceled}set fetchAbortController(e){this.completed||this.canceled||(this.isServiceRequest?this._fetchAbortController?console.error("Only one abort controller can be set for service-provided requests."):this._fetchAbortController=e:console.error("Unexpected attempt to set fetch abort controller on client-provided request."))}get fetchAbortController(){return this._fetchAbortController}get asFetchRequest(){const e=this.request.queryParameters,t={};let s="";if(this.request.headers)for(const[e,s]of Object.entries(this.request.headers))t[e]=s;return e&&0!==Object.keys(e).length&&(s=`?${this.queryStringFromObject(e)}`),new Request(`${this.origin}${this.request.path}${s}`,{method:this.request.method,headers:Object.keys(t).length?t:void 0,redirect:"follow"})}get serviceRequest(){return this._serviceRequest}set serviceRequest(e){if(this.isServiceRequest)return void console.error("Unexpected attempt to set service-provided request on service-provided request.");const t=this.serviceRequest;this._serviceRequest=e,!t||e&&t.identifier===e.identifier||t.detachRequest(this),this.completed||this.canceled||e&&(e.completed||e.canceled)?this._serviceRequest=void 0:t&&e&&t.identifier===e.identifier||e&&e.attachRequest(this)}get isServiceRequest(){return!this.client}dependentRequests(){return this.isServiceRequest?Object.values(this.dependents):[]}attachRequest(e){this.isServiceRequest&&!this.dependents[e.identifier]?(this.dependents[e.identifier]=e,this.addEventListenersForRequest(e)):this.isServiceRequest||console.error("Unexpected attempt to attach requests using client-provided request.")}detachRequest(e){this.isServiceRequest&&this.dependents[e.identifier]?(delete this.dependents[e.identifier],e.removeEventListenersFromRequest(),0===Object.keys(this.dependents).length&&this.cancel("Cancel request")):this.isServiceRequest||console.error("Unexpected attempt to detach requests using client-provided request.")}cancel(e,t=!1){if(this.completed||this.canceled)return[];const s=this.dependentRequests();return this.isServiceRequest?(t||s.forEach((e=>e.serviceRequest=void 0)),this._fetchAbortController&&(this._fetchAbortController.abort(e),this._fetchAbortController=void 0)):this.serviceRequest=void 0,this._canceled=!0,this.stopRequestTimeoutTimer(),this.dispatchEvent(new E(this)),s}requestTimeoutTimer(){return new Promise(((e,t)=>{this._fetchTimeoutTimer=setTimeout((()=>{t(new Error("Request timeout")),this.cancel("Cancel because of timeout",!0)}),1e3*this.request.timeout)}))}stopRequestTimeoutTimer(){this._fetchTimeoutTimer&&(clearTimeout(this._fetchTimeoutTimer),this._fetchTimeoutTimer=void 0)}handleProcessingStarted(){this.logRequestStart(this),this.dispatchEvent(new S(this))}handleProcessingSuccess(e,t){this.addRequestInformationForResult(this,e,t),this.logRequestSuccess(this,t),this._completed=!0,this.stopRequestTimeoutTimer(),this.dispatchEvent(new C(this,e,t))}handleProcessingError(e,t){this.addRequestInformationForResult(this,e,t),this.logRequestError(this,t),this._completed=!0,this.stopRequestTimeoutTimer(),this.dispatchEvent(new R(this,e,t))}addEventListenersForRequest(e){this.isServiceRequest?(e.abortController=new AbortController,this.addEventListener(n.Started,(t=>{t instanceof S&&(e.logRequestStart(t.request),e.dispatchEvent(t.clone(e)))}),{signal:e.abortController.signal,once:!0}),this.addEventListener(n.Success,(t=>{t instanceof C&&(e.removeEventListenersFromRequest(),e.addRequestInformationForResult(t.request,t.fetchRequest,t.response),e.logRequestSuccess(t.request,t.response),e._completed=!0,e.dispatchEvent(t.clone(e)))}),{signal:e.abortController.signal,once:!0}),this.addEventListener(n.Error,(t=>{t instanceof R&&(e.removeEventListenersFromRequest(),e.addRequestInformationForResult(t.request,t.fetchRequest,t.error),e.logRequestError(t.request,t.error),e._completed=!0,e.dispatchEvent(t.clone(e)))}),{signal:e.abortController.signal,once:!0})):console.error("Unexpected attempt to add listeners using a client-provided request.")}removeEventListenersFromRequest(){!this.isServiceRequest&&this.abortController?(this.abortController.abort(),this.abortController=void 0):this.isServiceRequest&&console.error("Unexpected attempt to remove listeners using a client-provided request.")}hasAnyChannelsOrGroups(e,t){return this.channels.some((t=>e.includes(t)))||this.channelGroups.some((e=>t.includes(e)))}addRequestInformationForResult(e,t,s){this.isServiceRequest||(s.clientIdentifier=this.client.identifier,s.identifier=this.identifier,s.url=t.url)}logRequestStart(e){this.isServiceRequest||this.client.logger.debug((()=>({messageType:"network-request",message:e.request})))}logRequestSuccess(e,t){this.isServiceRequest||this.client.logger.debug((()=>{const{status:s,headers:n,body:i}=t.response,r=e.asFetchRequest;return Object.entries(n).forEach((([e,t])=>t)),{messageType:"network-response",message:{status:s,url:r.url,headers:n,body:i}}}))}logRequestError(e,t){this.isServiceRequest||((t.error?t.error.message:"Unknown").toLowerCase().includes("timeout")?this.client.logger.debug((()=>({messageType:"network-request",message:e.request,details:"Timeout",canceled:!0}))):this.client.logger.warn((()=>{const{details:s,canceled:n}=this.errorDetailsFromSendingError(t);let i=s;return n?i="Aborted":s.toLowerCase().includes("network")&&(i="Network error"),{messageType:"network-request",message:e.request,details:i,canceled:n,failed:!n}})))}errorDetailsFromSendingError(e){const t=!!e.error&&("TIMEOUT"===e.error.type||"ABORTED"===e.error.type);let s=e.error?e.error.message:"Unknown";if(e.response){const t=e.response.headers["content-type"];if(e.response.body&&t&&(-1!==t.indexOf("javascript")||-1!==t.indexOf("json")))try{const t=JSON.parse((new TextDecoder).decode(e.response.body));"message"in t?s=t.message:"error"in t&&("string"==typeof t.error?s=t.error:"object"==typeof t.error&&"message"in t.error&&(s=t.error.message))}catch(e){}"Unknown"===s&&(s=e.response.status>=500?"Internal Server Error":400==e.response.status?"Bad request":403==e.response.status?"Access denied":`${e.response.status}`)}return{details:s,canceled:t}}encodeString(e){return encodeURIComponent(e).replace(/[!~*'()]/g,(e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`))}}class F extends P{static fromTransportRequest(e,t,s){return new F(e,t,s)}static fromCachedState(e,t,s,n,i,r){return new F(e,t,r,s,n,i)}static fromRequests(e,t,s,n,i){var r;const a=e[Math.floor(Math.random()*e.length)],o="0"===(null!==(r=a.request.queryParameters.tt)&&void 0!==r?r:"0"),c=o&&null!=i?i:{},l=Object.assign({},a.request),h=new Set,u=new Set;for(const t of e)o&&!i&&t.state&&Object.assign(c,t.state),t.channelGroups.forEach(h.add,h),t.channels.forEach(u.add,u);if(u.size||h.size){const e=l.path.split("/");e[4]=u.size?[...u].sort().join(","):",",l.path=e.join("/")}h.size&&(l.queryParameters["channel-group"]=[...h].sort().join(",")),Object.keys(c).length?l.queryParameters.state=JSON.stringify(c):delete l.queryParameters.state,t&&(l.queryParameters.auth=t.toString()),l.identifier=O.createUUID();const d=new F(l,a.subscribeKey,t,[...h],[...u],c);for(const t of e)t.serviceRequest=d;return d.isInitialSubscribe&&s&&"0"!==s&&(d.timetokenOverride=s,n&&(d.timetokenRegionOverride=n)),d}constructor(e,t,s,n,i,r){var a;const o=!!e.queryParameters&&"on-demand"in e.queryParameters;if(delete e.queryParameters["on-demand"],super(e,t,e.queryParameters.uuid,null!=i?i:F.channelsFromRequest(e),null!=n?n:F.channelGroupsFromRequest(e),s),this._creationDate=Date.now(),this.timetokenRegionOverride="0",this._creationDate<=F.lastCreationDate?(F.lastCreationDate++,this._creationDate=F.lastCreationDate):F.lastCreationDate=this._creationDate,this._requireCachedStateReset=o,e.queryParameters["filter-expr"]&&(this.filterExpression=e.queryParameters["filter-expr"]),this._timetoken=null!==(a=e.queryParameters.tt)&&void 0!==a?a:"0","0"===this._timetoken&&(delete e.queryParameters.tt,delete e.queryParameters.tr),e.queryParameters.tr&&(this._region=e.queryParameters.tr),r&&(this.state=r),this.state||!e.queryParameters.state||e.queryParameters.state.length<=2||"0"!==this._timetoken)return;const c=JSON.parse(e.queryParameters.state);for(const e of Object.keys(c))this.channels.includes(e)||this.channelGroups.includes(e)||delete c[e];this.state=c}get creationDate(){return this._creationDate}get asIdentifier(){const e=this.accessToken?this.accessToken.asIdentifier:void 0,t=`${this.userId}-${this.subscribeKey}${e?`-${e}`:""}`;return this.filterExpression?`${t}-${this.filterExpression}`:t}get isInitialSubscribe(){return"0"===this._timetoken}get timetoken(){return this._timetoken}set timetoken(e){this._timetoken=e,this.request.queryParameters.tt=e}get region(){return this._region}set region(e){this._region=e,e?this.request.queryParameters.tr=e:delete this.request.queryParameters.tr}get requireCachedStateReset(){return this._requireCachedStateReset}static useCachedState(e){return!!e.queryParameters&&!("on-demand"in e.queryParameters)}resetToInitialRequest(){this._requireCachedStateReset=!0,this._timetoken="0",this._region=void 0,delete this.request.queryParameters.tt}isSubsetOf(e){return!(e.channelGroups.length&&!this.includesStrings(e.channelGroups,this.channelGroups))&&(!(e.channels.length&&!this.includesStrings(e.channels,this.channels))&&("0"===this.timetoken||this.timetoken===e.timetoken||"0"===e.timetoken))}toString(){return`SubscribeRequest { clientIdentifier: ${this.client?this.client.identifier:"service request"}, requestIdentifier: ${this.identifier}, serviceRequestIdentified: ${this.client?this.serviceRequest?this.serviceRequest.identifier:"'not set'":"'is service request"}, channels: [${this.channels.length?this.channels.map((e=>`'${e}'`)).join(", "):""}], channelGroups: [${this.channelGroups.length?this.channelGroups.map((e=>`'${e}'`)).join(", "):""}], timetoken: ${this.timetoken}, region: ${this.region}, reset: ${this._requireCachedStateReset?"'reset'":"'do not reset'"} }`}toJSON(){return this.toString()}static channelsFromRequest(e){const t=e.path.split("/")[4];return","===t?[]:t.split(",").filter((e=>e.length>0))}static channelGroupsFromRequest(e){if(!e.queryParameters||!e.queryParameters["channel-group"])return[];const t=e.queryParameters["channel-group"];return 0===t.length?[]:t.split(",").filter((e=>e.length>0))}includesStrings(e,t){const s=new Set(e);return t.every(s.has,s)}}F.lastCreationDate=0;class L{static compare(e,t){var s,n;return(null!==(s=e.expiration)&&void 0!==s?s:0)-(null!==(n=t.expiration)&&void 0!==n?n:0)}constructor(e,t,s){this.token=e,this.simplifiedToken=t,this.expiration=s}get asIdentifier(){var e;return null!==(e=this.simplifiedToken)&&void 0!==e?e:this.token}equalTo(e,t=!1){return this.asIdentifier===e.asIdentifier&&(!t||this.expiration===e.expiration)}isNewerThan(e){return!!this.simplifiedToken&&this.expiration>e.expiration}toString(){return this.token}}!function(e){e.GET="GET",e.POST="POST",e.PATCH="PATCH",e.DELETE="DELETE",e.LOCAL="LOCAL"}(I||(I={}));class j extends P{static fromTransportRequest(e,t,s){return new j(e,t,s)}constructor(e,t,s){const n=j.channelGroupsFromRequest(e),i=j.channelsFromRequest(e),r=n.filter((e=>!e.endsWith("-pnpres"))),a=i.filter((e=>!e.endsWith("-pnpres")));super(e,t,e.queryParameters.uuid,a,r,s),this.allChannelGroups=n,this.allChannels=i}toString(){return`LeaveRequest { channels: [${this.channels.length?this.channels.map((e=>`'${e}'`)).join(", "):""}], channelGroups: [${this.channelGroups.length?this.channelGroups.map((e=>`'${e}'`)).join(", "):""}] }`}toJSON(){return this.toString()}static channelsFromRequest(e){const t=e.path.split("/")[6];return","===t?[]:t.split(",").filter((e=>e.length>0))}static channelGroupsFromRequest(e){if(!e.queryParameters||!e.queryParameters["channel-group"])return[];const t=e.queryParameters["channel-group"];return 0===t.length?[]:t.split(",").filter((e=>e.length>0))}}const _=(e,t,s)=>{if(t=t.filter((e=>!e.endsWith("-pnpres"))).map((e=>x(e))).sort(),s=s.filter((e=>!e.endsWith("-pnpres"))).map((e=>x(e))).sort(),0===t.length&&0===s.length)return;const n=s.length>0?s.join(","):void 0,i=0===t.length?",":t.join(","),r=Object.assign(Object.assign({instanceid:e.identifier,uuid:e.userId,requestid:O.createUUID()},e.accessToken?{auth:e.accessToken.toString()}:{}),n?{"channel-group":n}:{}),a={origin:e.origin,path:`/v2/presence/sub-key/${e.subKey}/channel/${i}/leave`,queryParameters:r,method:I.GET,headers:{},timeout:10,cancellable:!1,compressible:!1,identifier:r.requestid};return j.fromTransportRequest(a,e.subKey,e.accessToken)},x=e=>encodeURIComponent(e).replace(/[!~*'()]/g,(e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`));class U{static squashedChanges(e){if(!e.length||1===e.length)return e;const t=e.sort(((e,t)=>e.timestamp-t.timestamp)),s=t.filter((e=>!e.remove));s.forEach((e=>{for(let n=0;n<s.length;n++){const i=s[n];if(i.remove&&i.request.identifier===e.request.identifier){t.splice(n,1),t.splice(t.indexOf(e),1);break}}}));const n={};return s.forEach((e=>{if(n[e.clientIdentifier]){const s=t.indexOf(e);s>=0&&t.splice(s,1)}n[e.clientIdentifier]=e})),t}constructor(e,t,s,n,i=!1){this.clientIdentifier=e,this.request=t,this.remove=s,this.sendLeave=n,this.clientInvalidate=i,this._timestamp=this.timestampForChange()}get timestamp(){return this._timestamp}toString(){return`SubscriptionStateChange { timestamp: ${this.timestamp}, client: ${this.clientIdentifier}, request: ${this.request.toString()}, remove: ${this.remove?"'remove'":"'do not remove'"}, sendLeave: ${this.sendLeave?"'send'":"'do not send'"} }`}toJSON(){return this.toString()}timestampForChange(){const e=Date.now();return e<=U.previousChangeTimestamp?U.previousChangeTimestamp++:U.previousChangeTimestamp=e,U.previousChangeTimestamp}}U.previousChangeTimestamp=0;class G extends EventTarget{constructor(e){super(),this.identifier=e,this.requestListenersAbort={},this.clientsState={},this.clientsPresenceState={},this.lastCompletedRequest={},this.clientsForInvalidation=[],this.requests={},this.serviceRequests=[],this.channelGroups=new Set,this.channels=new Set}hasStateForClient(e){return!!this.clientsState[e.identifier]}uniqueStateForClient(e,t,s){let n=[...s],i=[...t];return Object.entries(this.clientsState).forEach((([t,s])=>{t!==e.identifier&&(n=n.filter((e=>!s.channelGroups.has(e))),i=i.filter((e=>!s.channels.has(e))))})),{channels:i,channelGroups:n}}requestForClient(e,t=!1){var s;return null!==(s=this.requests[e.identifier])&&void 0!==s?s:t?this.lastCompletedRequest[e.identifier]:void 0}updateClientAccessToken(e){this.accessToken&&!e.isNewerThan(this.accessToken)||(this.accessToken=e)}updateClientPresenceState(e,t){const s=this.clientsPresenceState[e.identifier];null!=t||(t={}),s?(Object.assign(s.state,t),s.update=Date.now()):this.clientsPresenceState[e.identifier]={update:Date.now(),state:t}}invalidateClient(e){this.clientsForInvalidation.includes(e.identifier)||this.clientsForInvalidation.push(e.identifier)}processChanges(e){if(e.length&&(e=U.squashedChanges(e)),!e.length)return;let t=0===this.channelGroups.size&&0===this.channels.size;t||(t=e.some((e=>e.remove||e.request.requireCachedStateReset)));const s=this.applyChanges(e);let n;t&&(n=this.refreshInternalState()),this.handleSubscriptionStateChange(e,n,s.initial,s.continuation,s.removed),Object.keys(this.clientsState).length||this.dispatchEvent(new m)}applyChanges(e){const t=[],s=[],n=[];return e.forEach((e=>{const{remove:i,request:r,clientIdentifier:a,clientInvalidate:o}=e;i||(r.isInitialSubscribe?s.push(r):t.push(r),this.requests[a]=r,this.addListenersForRequestEvents(r)),i&&(this.requests[a]||this.lastCompletedRequest[a])&&(o&&(delete this.clientsPresenceState[a],delete this.lastCompletedRequest[a],delete this.clientsState[a]),delete this.requests[a],n.push(r))})),{initial:s,continuation:t,removed:n}}handleSubscriptionStateChange(e,t,s,n,i){var r,a,o,c;const l=this.serviceRequests.filter((e=>!e.completed&&!e.canceled)),h=[],u=[],d=[],g=[];let p,f,q,m;const b=e=>{g.push(e);const t=e.dependentRequests().filter((e=>!i.includes(e)));0!==t.length&&(t.forEach((e=>e.serviceRequest=void 0)),(e.isInitialSubscribe?s:n).push(...t))};if(t)if(t.channels.added||t.channelGroups.added){for(const e of l)b(e);l.length=0}else if(t.channels.removed||t.channelGroups.removed){const e=null!==(r=t.channelGroups.removed)&&void 0!==r?r:[],s=null!==(a=t.channels.removed)&&void 0!==a?a:[];for(let t=l.length-1;t>=0;t--){const n=l[t];n.hasAnyChannelsOrGroups(s,e)&&(b(n),l.splice(t,1))}}n=this.squashSameClientRequests(n),((s=this.squashSameClientRequests(s)).length?n:[]).forEach((e=>{let t=!m;t||"0"===e.timetoken||("0"===m?t=!0:e.timetoken<m&&(t=e.creationDate>f)),t&&(f=e.creationDate,m=e.timetoken,q=e.region)}));const S={};n.forEach((e=>{S[e.timetoken]?S[e.timetoken].push(e):S[e.timetoken]=[e]})),this.attachToServiceRequest(l,s);for(let e=s.length-1;e>=0;e--){const t=s[e];l.forEach((n=>{if(!t.isSubsetOf(n)||n.isInitialSubscribe)return;const{region:i,timetoken:r}=n;h.push({request:t,timetoken:r,region:i}),s.splice(e,1)}))}if(s.length){let e;if(n.length){m=Object.keys(S).sort().pop();const t=S[m];q=t[0].region,delete S[m],t.forEach((e=>e.resetToInitialRequest())),e=[...s,...t]}else e=s;this.createAggregatedRequest(e,d,m,q)}Object.values(S).forEach((e=>{this.attachToServiceRequest(d,e),this.attachToServiceRequest(l,e),this.createAggregatedRequest(e,u)}));const C=new Set,R=new Set;if(t&&i.length&&(t.channels.removed||t.channelGroups.removed)){const s=null!==(o=t.channelGroups.removed)&&void 0!==o?o:[],n=null!==(c=t.channels.removed)&&void 0!==c?c:[],r=i[0].client;e.filter((e=>e.remove&&e.sendLeave)).forEach((e=>{const{channels:t,channelGroups:i}=e.request;s.forEach((e=>i.includes(e)&&C.add(e))),n.forEach((e=>t.includes(e)&&R.add(e)))})),p=_(r,[...R],[...C])}(h.length||d.length||u.length||g.length||p)&&this.dispatchEvent(new v(h,[...d,...u],g,p))}refreshInternalState(){const e=new Set,t=new Set;Object.entries(this.requests).forEach((([s,n])=>{var i,r;const a=this.clientsPresenceState[s],o=a?Object.keys(a.state):[],c=null!==(i=(r=this.clientsState)[s])&&void 0!==i?i:r[s]={channels:new Set,channelGroups:new Set};n.channelGroups.forEach((t=>{c.channelGroups.add(t),e.add(t)})),n.channels.forEach((e=>{c.channels.add(e),t.add(e)})),a&&o.length&&(o.forEach((e=>{n.channels.includes(e)||n.channelGroups.includes(e)||delete a.state[e]})),0===Object.keys(a.state).length&&delete this.clientsPresenceState[s])}));const s=this.subscriptionStateChanges(t,e);this.channelGroups=e,this.channels=t;const n=Object.values(this.requests).flat().filter((e=>!!e.accessToken)).map((e=>e.accessToken)).sort(L.compare);if(n&&n.length>0){const e=n.pop();(!this.accessToken||e&&e.isNewerThan(this.accessToken))&&(this.accessToken=e)}return s}addListenersForRequestEvents(e){const t=this.requestListenersAbort[e.identifier]=new AbortController,s=()=>{if(this.removeListenersFromRequestEvents(e),!e.isServiceRequest){if(this.requests[e.client.identifier]){this.lastCompletedRequest[e.client.identifier]=e,delete this.requests[e.client.identifier];const t=this.clientsForInvalidation.indexOf(e.client.identifier);t>0&&(this.clientsForInvalidation.splice(t,1),delete this.clientsPresenceState[e.client.identifier],delete this.lastCompletedRequest[e.client.identifier],delete this.clientsState[e.client.identifier],Object.keys(this.clientsState).length||this.dispatchEvent(new m))}return}const t=this.serviceRequests.indexOf(e);t>=0&&this.serviceRequests.splice(t,1)};e.addEventListener(n.Success,s,{signal:t.signal,once:!0}),e.addEventListener(n.Error,s,{signal:t.signal,once:!0}),e.addEventListener(n.Canceled,s,{signal:t.signal,once:!0})}removeListenersFromRequestEvents(e){this.requestListenersAbort[e.request.identifier]&&(this.requestListenersAbort[e.request.identifier].abort(),delete this.requestListenersAbort[e.request.identifier])}subscriptionStateChanges(e,t){const s=0===this.channelGroups.size&&0===this.channels.size,n={channelGroups:{},channels:{}},i=[],r=[],a=[],o=[];for(const e of t)this.channelGroups.has(e)||r.push(e);for(const t of e)this.channels.has(t)||o.push(t);if(!s){for(const e of this.channelGroups)t.has(e)||i.push(e);for(const t of this.channels)e.has(t)||a.push(t)}return(o.length||a.length)&&(n.channels=Object.assign(Object.assign({},o.length?{added:o}:{}),a.length?{removed:a}:{})),(r.length||i.length)&&(n.channelGroups=Object.assign(Object.assign({},r.length?{added:r}:{}),i.length?{removed:i}:{})),0===Object.keys(n.channelGroups).length&&0===Object.keys(n.channels).length?void 0:n}squashSameClientRequests(e){if(!e.length||1===e.length)return e;const t=e.sort(((e,t)=>e.creationDate-t.creationDate));return Object.values(t.reduce(((e,t)=>(e[t.client.identifier]=t,e)),{}))}attachToServiceRequest(e,t){e.length&&t.length&&[...t].forEach((s=>{for(const n of e){if(s.serviceRequest||!s.isSubsetOf(n)||s.isInitialSubscribe&&!n.isInitialSubscribe)continue;s.serviceRequest=n;const e=t.indexOf(s);t.splice(e,1);break}}))}createAggregatedRequest(e,t,s,n){var i;if(0===e.length)return;let r;"0"===(null!==(i=e[0].request.queryParameters.tt)&&void 0!==i?i:"0")&&Object.keys(this.clientsPresenceState).length&&(r={},e.forEach((e=>{var t;return Object.keys(null!==(t=e.state)&&void 0!==t?t:{}).length&&Object.assign(r,e.state)})),Object.values(this.clientsPresenceState).sort(((e,t)=>e.update-t.update)).forEach((({state:e})=>Object.assign(r,e))));const a=F.fromRequests(e,this.accessToken,s,n,r);this.addListenersForRequestEvents(a),e.forEach((e=>e.serviceRequest=a)),this.serviceRequests.push(a),t.push(a)}}function $(e,t,s,n){return new(s||(s=Promise))((function(i,r){function a(e){try{c(n.next(e))}catch(e){r(e)}}function o(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(a,o)}c((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class D extends EventTarget{sendRequest(e,t,s,n){e.handleProcessingStarted(),e.cancellable&&(e.fetchAbortController=new AbortController);const i=e.asFetchRequest;(()=>{$(this,void 0,void 0,(function*(){Promise.race([fetch(i,Object.assign(Object.assign({},e.fetchAbortController?{signal:e.fetchAbortController.signal}:{}),{keepalive:!0})),e.requestTimeoutTimer()]).then((e=>e.arrayBuffer().then((t=>[e,t])))).then((e=>n?n(e):e)).then((e=>{e[0].status>=400?s(i,this.requestProcessingError(void 0,e)):t(i,this.requestProcessingSuccess(e))})).catch((t=>{let n=t;if("string"==typeof t){const e=t.toLowerCase();n=new Error(t),!e.includes("timeout")&&e.includes("cancel")&&(n.name="AbortError")}e.stopRequestTimeoutTimer(),s(i,this.requestProcessingError(n))}))}))})()}requestProcessingSuccess(e){var t;const[s,n]=e,i=n.byteLength>0?n:void 0,r=parseInt(null!==(t=s.headers.get("Content-Length"))&&void 0!==t?t:"0",10),a=s.headers.get("Content-Type"),o={};return s.headers.forEach(((e,t)=>o[t.toLowerCase()]=e.toLowerCase())),{type:"request-process-success",clientIdentifier:"",identifier:"",url:"",response:{contentLength:r,contentType:a,headers:o,status:s.status,body:i}}}requestProcessingError(e,t){if(t)return Object.assign(Object.assign({},this.requestProcessingSuccess(t)),{type:"request-process-error"});let s="NETWORK_ISSUE",n="Unknown error",i="Error";e&&e instanceof Error&&(n=e.message,i=e.name);const r=n.toLowerCase();return r.includes("timeout")?s="TIMEOUT":("AbortError"===i||r.includes("aborted")||r.includes("cancel"))&&(n="Request aborted",s="ABORTED"),{type:"request-process-error",clientIdentifier:"",identifier:"",url:"",error:{name:i,type:s,message:n}}}encodeString(e){return encodeURIComponent(e).replace(/[!~*'()]/g,(e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`))}}class K extends D{constructor(e){super(),this.clientsManager=e,this.requestsChangeAggregationQueue={},this.clientAbortControllers={},this.subscriptionStates={},this.addEventListenersForClientsManager(e)}requestsChangeAggregationQueueForClient(e){for(const t of Object.keys(this.requestsChangeAggregationQueue)){const{changes:s}=this.requestsChangeAggregationQueue[t];if(Array.from(s).some((t=>t.clientIdentifier===e.identifier)))return[t,s]}return[void 0,new Set]}moveClient(e){const[t,s]=this.requestsChangeAggregationQueueForClient(e);let n=this.subscriptionStateForClient(e);const i=null==n?void 0:n.requestForClient(e);if(!n&&!s.size)return;n&&n.invalidateClient(e);let r=null==i?void 0:i.asIdentifier;if(!r&&s.size){const[e]=s;r=e.request.asIdentifier}if(!r)return;if(i&&(i.serviceRequest=void 0,n.processChanges([new U(e.identifier,i,!0,!1,!0)]),n=this.subscriptionStateForIdentifier(r),i.resetToInitialRequest(),n.processChanges([new U(e.identifier,i,!1,!1)])),!s.size||!this.requestsChangeAggregationQueue[t])return;this.startAggregationTimer(r);const a=this.requestsChangeAggregationQueue[t].changes;U.squashedChanges([...s]).filter((t=>t.clientIdentifier!==e.identifier||t.remove)).forEach(a.delete,a);const{changes:o}=this.requestsChangeAggregationQueue[r];U.squashedChanges([...s]).filter((t=>t.clientIdentifier===e.identifier&&!t.request.completed&&t.request.canceled&&!t.remove)).forEach(o.add,o)}removeClient(e,t,s,n=!1){var i;const[r,a]=this.requestsChangeAggregationQueueForClient(e),o=this.subscriptionStateForClient(e),c=null==o?void 0:o.requestForClient(e,n);if(!o&&!a.size)return;const l=null!==(i=o&&o.identifier)&&void 0!==i?i:r;if(a.size&&this.requestsChangeAggregationQueue[l]){const{changes:e}=this.requestsChangeAggregationQueue[l];a.forEach(e.delete,e),this.stopAggregationTimerIfEmptyQueue(l)}c&&(c.serviceRequest=void 0,t?(this.startAggregationTimer(l),this.enqueueForAggregation(e,c,!0,s,n)):o&&o.processChanges([new U(e.identifier,c,!0,s,n)]))}enqueueForAggregation(e,t,s,n,i=!1){const r=t.asIdentifier;this.startAggregationTimer(r);const{changes:a}=this.requestsChangeAggregationQueue[r];a.add(new U(e.identifier,t,s,n,i))}startAggregationTimer(e){this.requestsChangeAggregationQueue[e]||(this.requestsChangeAggregationQueue[e]={timeout:setTimeout((()=>this.handleDelayedAggregation(e)),50),changes:new Set})}stopAggregationTimerIfEmptyQueue(e){const t=this.requestsChangeAggregationQueue[e];t&&0===t.changes.size&&(t.timeout&&clearTimeout(t.timeout),delete this.requestsChangeAggregationQueue[e])}handleDelayedAggregation(e){if(!this.requestsChangeAggregationQueue[e])return;const t=this.subscriptionStateForIdentifier(e),s=[...this.requestsChangeAggregationQueue[e].changes];delete this.requestsChangeAggregationQueue[e],t.processChanges(s)}subscriptionStateForIdentifier(e){let t=this.subscriptionStates[e];return t||(t=this.subscriptionStates[e]=new G(e),this.addListenerForSubscriptionStateEvents(t)),t}addEventListenersForClientsManager(s){s.addEventListener(t.Registered,(t=>{const{client:s}=t,n=new AbortController;this.clientAbortControllers[s.identifier]=n,s.addEventListener(e.IdentityChange,(e=>{e instanceof o&&(!!e.oldUserId!=!!e.newUserId||e.oldUserId&&e.newUserId&&e.newUserId!==e.oldUserId)&&this.moveClient(s)}),{signal:n.signal}),s.addEventListener(e.AuthChange,(e=>{var t;e instanceof c&&(!!e.oldAuth!=!!e.newAuth||e.oldAuth&&e.newAuth&&!e.oldAuth.equalTo(e.newAuth)?this.moveClient(s):e.oldAuth&&e.newAuth&&e.oldAuth.equalTo(e.newAuth)&&(null===(t=this.subscriptionStateForClient(s))||void 0===t||t.updateClientAccessToken(e.newAuth)))}),{signal:n.signal}),s.addEventListener(e.PresenceStateChange,(e=>{var t;e instanceof h&&(null===(t=this.subscriptionStateForClient(e.client))||void 0===t||t.updateClientPresenceState(e.client,e.state))}),{signal:n.signal}),s.addEventListener(e.SendSubscribeRequest,(e=>{e instanceof u&&this.enqueueForAggregation(e.client,e.request,!1,!1)}),{signal:n.signal}),s.addEventListener(e.CancelSubscribeRequest,(e=>{e instanceof d&&this.enqueueForAggregation(e.client,e.request,!0,!1)}),{signal:n.signal}),s.addEventListener(e.SendLeaveRequest,(e=>{if(!(e instanceof p))return;const t=this.patchedLeaveRequest(e.request);t&&this.sendRequest(t,((e,s)=>t.handleProcessingSuccess(e,s)),((e,s)=>t.handleProcessingError(e,s)))}),{signal:n.signal})})),s.addEventListener(t.Unregistered,(e=>{const{client:t,withLeave:s}=e,n=this.clientAbortControllers[t.identifier];delete this.clientAbortControllers[t.identifier],n&&n.abort(),this.removeClient(t,!1,s,!0)}))}addListenerForSubscriptionStateEvents(e){const t=new AbortController;e.addEventListener(s.Changed,(e=>{const{requestsWithInitialResponse:t,canceledRequests:s,newRequests:n,leaveRequest:i}=e;s.forEach((e=>e.cancel("Cancel request"))),n.forEach((e=>{this.sendRequest(e,((t,s)=>e.handleProcessingSuccess(t,s)),((t,s)=>e.handleProcessingError(t,s)),e.isInitialSubscribe&&"0"!==e.timetokenOverride?t=>this.patchInitialSubscribeResponse(t,e.timetokenOverride,e.timetokenRegionOverride):void 0)})),t.forEach((e=>{const{request:t,timetoken:s,region:n}=e;t.handleProcessingStarted(),this.makeResponseOnHandshakeRequest(t,s,n)})),i&&this.sendRequest(i,((e,t)=>i.handleProcessingSuccess(e,t)),((e,t)=>i.handleProcessingError(e,t)))}),{signal:t.signal}),e.addEventListener(s.Invalidated,(()=>{delete this.subscriptionStates[e.identifier],t.abort()}),{signal:t.signal,once:!0})}subscriptionStateForClient(e){return Object.values(this.subscriptionStates).find((t=>t.hasStateForClient(e)))}patchedLeaveRequest(e){const t=this.subscriptionStateForClient(e.client);if(!t)return void e.cancel();const s=t.uniqueStateForClient(e.client,e.channels,e.channelGroups),n=_(e.client,s.channels,s.channelGroups);return n&&(e.serviceRequest=n),n}makeResponseOnHandshakeRequest(e,t,s){const n=(new TextEncoder).encode(`{"t":{"t":"${t}","r":${null!=s?s:"0"}},"m":[]}`);e.handleProcessingSuccess(e.asFetchRequest,{type:"request-process-success",clientIdentifier:"",identifier:"",url:"",response:{contentType:'text/javascript; charset="UTF-8"',contentLength:n.length,headers:{"content-type":'text/javascript; charset="UTF-8"',"content-length":`${n.length}`},status:200,body:n}})}patchInitialSubscribeResponse(e,t,s){if(void 0===t||"0"===t||e[0].status>=400)return e;let n;const i=e[0];let r=i,a=e[1];try{n=JSON.parse(K.textDecoder.decode(a))}catch(t){return console.error(`Subscribe response parse error: ${t}`),e}n.t.t=t,s&&(n.t.r=parseInt(s,10));try{if(a=K.textEncoder.encode(JSON.stringify(n)).buffer,a.byteLength){const e=new Headers(i.headers);e.set("Content-Length",`${a.byteLength}`),r=new Response(a,{status:i.status,statusText:i.statusText,headers:e})}}catch(t){return console.error(`Subscribe serialization error: ${t}`),e}return a.byteLength>0?[r,a]:e}}var H,N;K.textDecoder=new TextDecoder,K.textEncoder=new TextEncoder,function(e){e.Heartbeat="heartbeat",e.Invalidated="invalidated"}(H||(H={}));class B extends CustomEvent{constructor(e){super(H.Heartbeat,{detail:e})}get request(){return this.detail}clone(){return new B(this.request)}}class Q extends CustomEvent{constructor(){super(H.Invalidated)}clone(){return new Q}}class W extends P{static fromTransportRequest(e,t,s){return new W(e,t,s)}static fromCachedState(e,t,s,n,i,r){if(n.length||s.length){const t=e.path.split("/");t[6]=n.length?[...n].sort().join(","):",",e.path=t.join("/")}return s.length&&(e.queryParameters["channel-group"]=[...s].sort().join(",")),i&&Object.keys(i).length?e.queryParameters.state=JSON.stringify(i):delete e.queryParameters.state,r&&(e.queryParameters.auth=r.toString()),e.identifier=O.createUUID(),new W(e,t,r)}constructor(e,t,s){const n=W.channelGroupsFromRequest(e).filter((e=>!e.endsWith("-pnpres"))),i=W.channelsFromRequest(e).filter((e=>!e.endsWith("-pnpres")));if(super(e,t,e.queryParameters.uuid,i,n,s),!e.queryParameters.state||0===e.queryParameters.state.length)return;const r=JSON.parse(e.queryParameters.state);for(const e of Object.keys(r))this.channels.includes(e)||this.channelGroups.includes(e)||delete r[e];this.state=r}get asIdentifier(){const e=this.accessToken?this.accessToken.asIdentifier:void 0;return`${this.userId}-${this.subscribeKey}${e?`-${e}`:""}`}toString(){return`HeartbeatRequest { channels: [${this.channels.length?this.channels.map((e=>`'${e}'`)).join(", "):""}], channelGroups: [${this.channelGroups.length?this.channelGroups.map((e=>`'${e}'`)).join(", "):""}] }`}toJSON(){return this.toString()}static channelsFromRequest(e){const t=e.path.split("/")[6];return","===t?[]:t.split(",").filter((e=>e.length>0))}static channelGroupsFromRequest(e){if(!e.queryParameters||!e.queryParameters["channel-group"])return[];const t=e.queryParameters["channel-group"];return 0===t.length?[]:t.split(",").filter((e=>e.length>0))}}class M extends EventTarget{constructor(e){super(),this.identifier=e,this.clientsState={},this.clientsPresenceState={},this.requests={},this.lastHeartbeatTimestamp=0,this.canSendBackupHeartbeat=!0,this.isAccessDeniedError=!1,this._interval=0}set interval(e){const t=this._interval!==e;this._interval=e,t&&(0===e?this.stopTimer():this.startTimer())}set accessToken(e){if(!e)return void(this._accessToken=e);const t=Object.values(this.requests).filter((e=>!!e.accessToken)).map((e=>e.accessToken));t.push(e);const s=t.sort(L.compare).pop();(!this._accessToken||s&&s.isNewerThan(this._accessToken))&&(this._accessToken=s),this.isAccessDeniedError&&(this.canSendBackupHeartbeat=!0,this.startTimer(this.presenceTimerTimeout()))}stateForClient(e){if(!this.clientsState[e.identifier])return;const t=this.clientsState[e.identifier];return t?{channels:[...t.channels],channelGroups:[...t.channelGroups],state:t.state}:{channels:[],channelGroups:[]}}requestForClient(e){return this.requests[e.identifier]}addClientRequest(e,t){this.requests[e.identifier]=t,this.clientsState[e.identifier]={channels:t.channels,channelGroups:t.channelGroups},t.state&&(this.clientsState[e.identifier].state=Object.assign({},t.state));const s=this.clientsPresenceState[e.identifier],n=s?Object.keys(s.state):[];s&&n.length&&(n.forEach((e=>{t.channels.includes(e)||t.channelGroups.includes(e)||delete s.state[e]})),0===Object.keys(s.state).length&&delete this.clientsPresenceState[e.identifier]);const i=Object.values(this.requests).filter((e=>!!e.accessToken)).map((e=>e.accessToken)).sort(L.compare);if(i&&i.length>0){const e=i.pop();(!this._accessToken||e&&e.isNewerThan(this._accessToken))&&(this._accessToken=e)}this.sendAggregatedHeartbeat(t)}removeClient(e){delete this.clientsPresenceState[e.identifier],delete this.clientsState[e.identifier],delete this.requests[e.identifier],Object.keys(this.clientsState).length||(this.stopTimer(),this.dispatchEvent(new Q))}removeFromClientState(e,t,s){const n=this.clientsPresenceState[e.identifier],i=this.clientsState[e.identifier];i&&(i.channelGroups=i.channelGroups.filter((e=>!s.includes(e))),i.channels=i.channels.filter((e=>!t.includes(e))),n&&Object.keys(n.state).length&&(s.forEach((e=>delete n.state[e])),t.forEach((e=>delete n.state[e])),0===Object.keys(n.state).length&&delete this.clientsPresenceState[e.identifier]),0!==i.channels.length||0!==i.channelGroups.length?i.state&&Object.keys(i.state).forEach((e=>{i.channels.includes(e)||i.channelGroups.includes(e)||delete i.state[e]})):this.removeClient(e))}updateClientPresenceState(e,t){const s=this.clientsPresenceState[e.identifier];null!=t||(t={}),s?(Object.assign(s.state,t),s.update=Date.now()):this.clientsPresenceState[e.identifier]={update:Date.now(),state:t}}startTimer(e){this.stopTimer(),0!==Object.keys(this.clientsState).length&&(this.timeout=setTimeout((()=>this.handlePresenceTimer()),1e3*(null!=e?e:this._interval)))}stopTimer(){this.timeout&&clearTimeout(this.timeout),this.timeout=void 0}sendAggregatedHeartbeat(e){if(0!==this.lastHeartbeatTimestamp){const t=this.lastHeartbeatTimestamp+1e3*this._interval;let s=.05*this._interval;this._interval-s<3&&(s=0);if(t-Date.now()>1e3*s){if(e&&this.previousRequestResult){const t=e.asFetchRequest,s=Object.assign(Object.assign({},this.previousRequestResult),{clientIdentifier:e.client.identifier,identifier:e.identifier,url:t.url});return e.handleProcessingStarted(),void e.handleProcessingSuccess(t,s)}if(!e)return}}const t=Object.values(this.requests),s=t[Math.floor(Math.random()*t.length)],n=Object.assign({},s.request),i={},r=new Set,a=new Set;Object.entries(this.clientsState).forEach((([e,t])=>{t.state&&Object.assign(i,t.state),t.channelGroups.forEach(r.add,r),t.channels.forEach(a.add,a)})),Object.keys(this.clientsPresenceState).length&&Object.values(this.clientsPresenceState).sort(((e,t)=>e.update-t.update)).forEach((({state:e})=>Object.assign(i,e))),this.lastHeartbeatTimestamp=Date.now();const o=W.fromCachedState(n,t[0].subscribeKey,[...r],[...a],Object.keys(i).length>0?i:void 0,this._accessToken);Object.values(this.requests).forEach((e=>!e.serviceRequest&&(e.serviceRequest=o))),this.addListenersForRequest(o),this.dispatchEvent(new B(o)),e&&this.startTimer()}addListenersForRequest(e){const t=new AbortController,s=e=>{if(t.abort(),e instanceof C){const{response:t}=e;this.previousRequestResult=t}else if(e instanceof R){const{error:t}=e;this.canSendBackupHeartbeat=!0,this.isAccessDeniedError=!1,t.response&&t.response.status>=400&&t.response.status<500&&(this.isAccessDeniedError=403===t.response.status,this.canSendBackupHeartbeat=!1)}};e.addEventListener(n.Success,s,{signal:t.signal,once:!0}),e.addEventListener(n.Error,s,{signal:t.signal,once:!0}),e.addEventListener(n.Canceled,s,{signal:t.signal,once:!0})}handlePresenceTimer(){if(0===Object.keys(this.clientsState).length||!this.canSendBackupHeartbeat)return;const e=this.presenceTimerTimeout();this.sendAggregatedHeartbeat(),this.startTimer(e)}presenceTimerTimeout(){const e=(Date.now()-this.lastHeartbeatTimestamp)/1e3;let t=this._interval;return e<t&&(t-=e),t===this._interval&&(t+=.05),t=Math.max(t,3),t}}class z extends D{constructor(e){super(),this.clientsManager=e,this.heartbeatStates={},this.clientAbortControllers={},this.subscribeOnClientEvents(e)}heartbeatStateForClient(e){for(const t of Object.values(this.heartbeatStates))if(t.stateForClient(e))return t}moveClient(e){const t=this.heartbeatStateForClient(e),s=t?t.requestForClient(e):void 0;t&&s&&(this.removeClient(e),this.addClient(e,s))}addClient(e,t){var s;const n=t.asIdentifier;let i=this.heartbeatStates[n];i?e.heartbeatInterval&&i.interval>0&&e.heartbeatInterval>0&&e.heartbeatInterval<i.interval&&(i.interval=e.heartbeatInterval):(i=this.heartbeatStates[n]=new M(n),i.interval=null!==(s=e.heartbeatInterval)&&void 0!==s?s:0,this.addListenerForHeartbeatStateEvents(i)),i.addClientRequest(e,t)}removeClient(e){const t=this.heartbeatStateForClient(e);t&&t.removeClient(e)}subscribeOnClientEvents(s){s.addEventListener(t.Registered,(t=>{const{client:s}=t,n=new AbortController;this.clientAbortControllers[s.identifier]=n,s.addEventListener(e.Disconnect,(()=>this.removeClient(s)),{signal:n.signal}),s.addEventListener(e.IdentityChange,(e=>{if(e instanceof o&&(!!e.oldUserId!=!!e.newUserId||e.oldUserId&&e.newUserId&&e.newUserId!==e.oldUserId)){const t=this.heartbeatStateForClient(s),n=t?t.requestForClient(s):void 0;n&&(n.userId=e.newUserId),this.moveClient(s)}}),{signal:n.signal}),s.addEventListener(e.AuthChange,(e=>{if(!(e instanceof c))return;const t=this.heartbeatStateForClient(s),n=t?t.requestForClient(s):void 0;n&&(n.accessToken=e.newAuth),!!e.oldAuth!=!!e.newAuth||e.oldAuth&&e.newAuth&&!e.newAuth.equalTo(e.oldAuth)?this.moveClient(s):t&&e.oldAuth&&e.newAuth&&e.oldAuth.equalTo(e.newAuth)&&(t.accessToken=e.newAuth)}),{signal:n.signal}),s.addEventListener(e.HeartbeatIntervalChange,(e=>{var t;const n=e,i=this.heartbeatStateForClient(s);i&&(i.interval=null!==(t=n.newInterval)&&void 0!==t?t:0)}),{signal:n.signal}),s.addEventListener(e.PresenceStateChange,(e=>{var t;e instanceof h&&(null===(t=this.heartbeatStateForClient(e.client))||void 0===t||t.updateClientPresenceState(e.client,e.state))}),{signal:n.signal}),s.addEventListener(e.SendHeartbeatRequest,(e=>this.addClient(s,e.request)),{signal:n.signal}),s.addEventListener(e.SendLeaveRequest,(e=>{const{request:t}=e,n=this.heartbeatStateForClient(s);n&&n.removeFromClientState(s,t.channels,t.channelGroups)}),{signal:n.signal})})),s.addEventListener(t.Unregistered,(e=>{const{client:t}=e,s=this.clientAbortControllers[t.identifier];delete this.clientAbortControllers[t.identifier],s&&s.abort(),this.removeClient(t)}))}addListenerForHeartbeatStateEvents(e){const t=new AbortController;e.addEventListener(H.Heartbeat,(e=>{const{request:t}=e;this.sendRequest(t,((e,s)=>t.handleProcessingSuccess(e,s)),((e,s)=>t.handleProcessingError(e,s)))}),{signal:t.signal}),e.addEventListener(H.Invalidated,(()=>{delete this.heartbeatStates[e.identifier],t.abort()}),{signal:t.signal,once:!0})}}z.textDecoder=new TextDecoder,function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Info=2]="Info",e[e.Warn=3]="Warn",e[e.Error=4]="Error",e[e.None=5]="None"}(N||(N={}));class J{constructor(e,t){this.minLogLevel=e,this.port=t}debug(e){this.log(e,N.Debug)}error(e){this.log(e,N.Error)}info(e){this.log(e,N.Info)}trace(e){this.log(e,N.Trace)}warn(e){this.log(e,N.Warn)}log(e,t){if(t<this.minLogLevel)return;let s;s="string"==typeof e?{messageType:"text",message:e}:"function"==typeof e?e():e,s.level=t;try{this.port.postMessage({type:"shared-worker-console-log",message:s})}catch(e){this.minLogLevel!==N.None&&console.error(`[SharedWorker] Unable send message using message port: ${e}`)}}}class V extends EventTarget{constructor(e,t,s,n,i,r){super(),this.identifier=e,this.subKey=t,this.userId=s,this.port=n,this.requests={},this.listenerAbortController=new AbortController,this.cachedSubscriptionChannelGroups=[],this.cachedSubscriptionChannels=[],this._invalidated=!1,this.logger=new J(i,this.port),this._heartbeatInterval=r,this.subscribeOnEvents()}invalidate(e=!1){this.listenerAbortController.abort(),this._invalidated=!0,this.cancelRequests()}get origin(){var e;return null!==(e=this._origin)&&void 0!==e?e:""}get heartbeatInterval(){return this._heartbeatInterval}get accessToken(){return this._accessToken}get isInvalidated(){return this._invalidated}get lastPongEvent(){return this._lastPongEvent}postEvent(e){try{return this.port.postMessage(e),!0}catch(e){this.logger.error(`Unable send message using message port: ${e}`)}return!1}subscribeOnEvents(){this.port.addEventListener("message",(e=>{"client-unregister"===e.data.type?this.handleUnregisterEvent():"client-update"===e.data.type?this.handleConfigurationUpdateEvent(e.data):"client-presence-state-update"===e.data.type?this.handlePresenceStateUpdateEvent(e.data):"send-request"===e.data.type?this.handleSendRequestEvent(e.data):"cancel-request"===e.data.type?this.handleCancelRequestEvent(e.data):"client-disconnect"===e.data.type?this.handleDisconnectEvent():"client-pong"===e.data.type&&this.handlePongEvent()}),{signal:this.listenerAbortController.signal})}handleUnregisterEvent(){this.invalidate(),this.dispatchEvent(new r(this))}handleConfigurationUpdateEvent(e){const{userId:t,accessToken:s,preProcessedToken:n,heartbeatInterval:i,workerLogLevel:r}=e;if(this.logger.minLogLevel=r,this.logger.debug((()=>({messageType:"object",message:{userId:t,authKey:s,token:n,heartbeatInterval:i,workerLogLevel:r},details:"Update client configuration with parameters:"}))),s||this.accessToken){const e=s?new L(s,(null!=n?n:{}).token,(null!=n?n:{}).expiration):void 0;if(!!e!=!!this.accessToken||e&&this.accessToken&&!e.equalTo(this.accessToken,!0)){const t=this._accessToken;this._accessToken=e,Object.values(this.requests).filter((e=>!e.completed&&e instanceof F||e instanceof W)).forEach((t=>t.accessToken=e)),this.dispatchEvent(new c(this,e,t))}}if(this.userId!==t){const e=this.userId;this.userId=t,Object.values(this.requests).filter((e=>!e.completed&&e instanceof F||e instanceof W