@baseportal/chat-widget 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
- "use strict";var BaseportalChatSDK=(()=>{var uc=Object.create;var Wt=Object.defineProperty;var dc=Object.getOwnPropertyDescriptor;var fc=Object.getOwnPropertyNames;var pc=Object.getPrototypeOf,gc=Object.prototype.hasOwnProperty;var mc=(c,a)=>()=>(a||c((a={exports:{}}).exports,a),a.exports),yc=(c,a)=>{for(var h in a)Wt(c,h,{get:a[h],enumerable:!0})},Ss=(c,a,h,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of fc(a))!gc.call(c,p)&&p!==h&&Wt(c,p,{get:()=>a[p],enumerable:!(d=dc(a,p))||d.enumerable});return c};var vc=(c,a,h)=>(h=c!=null?uc(pc(c)):{},Ss(a||!c||!c.__esModule?Wt(h,"default",{value:c,enumerable:!0}):h,c)),_c=c=>Ss(Wt({},"__esModule",{value:!0}),c);var Ls=mc((Rt,Jn)=>{"use strict";(function(c,a){typeof Rt=="object"&&typeof Jn=="object"?Jn.exports=a():typeof define=="function"&&define.amd?define([],a):typeof Rt=="object"?Rt.Ably=a():c.Ably=a()})(Rt,()=>{var c={},a={exports:c},h=Object.defineProperty,d=Object.defineProperties,p=Object.getOwnPropertyDescriptor,v=Object.getOwnPropertyDescriptors,A=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols,M=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable,P=(e,t,n)=>t in e?h(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,y=(e,t)=>{for(var n in t||(t={}))M.call(t,n)&&P(e,n,t[n]);if(T)for(var n of T(t))k.call(t,n)&&P(e,n,t[n]);return e},E=(e,t)=>d(e,v(t)),S=(e,t)=>{var n={};for(var i in e)M.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(e!=null&&T)for(var i of T(e))t.indexOf(i)<0&&k.call(e,i)&&(n[i]=e[i]);return n},H=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},ne=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of A(t))!M.call(e,s)&&s!==n&&h(e,s,{get:()=>t[s],enumerable:!(i=p(t,s))||i.enumerable});return e},W=e=>ne(h({},"__esModule",{value:!0}),e),F={};H(F,{ErrorInfo:()=>w,Realtime:()=>Ln,Rest:()=>Cn,default:()=>lc,msgpack:()=>jn,protocolMessageFromDeserialized:()=>Vo}),a.exports=W(F);var m=class{},z=typeof global<"u"?global:typeof window<"u"?window:self;function Q(e,t){return`${e}`.padStart(t?3:2,"0")}function me(e){return m.Config.logTimestamps?function(t){let n=new Date;e(Q(n.getHours())+":"+Q(n.getMinutes())+":"+Q(n.getSeconds())+"."+Q(n.getMilliseconds(),1)+" "+t)}:function(t){e(t)}}var le=()=>{var e;let t,n;return typeof((e=z?.console)==null?void 0:e.log)=="function"?(t=function(...i){console.log.apply(console,i)},n=console.warn?function(...i){console.warn.apply(console,i)}:t):t=n=function(){},[t,n].map(me)},he=class wt{constructor(){this.deprecated=(t,n)=>{this.deprecationWarning(`${t} is deprecated and will be removed in a future version. ${n}`)},this.shouldLog=t=>t<=this.logLevel,this.setLog=(t,n)=>{t!==void 0&&(this.logLevel=t),n!==void 0&&(this.logHandler=this.logErrorHandler=n)},this.logLevel=wt.defaultLogLevel,this.logHandler=wt.defaultLogHandler,this.logErrorHandler=wt.defaultLogErrorHandler}static initLogHandlers(){let[t,n]=le();this.defaultLogHandler=t,this.defaultLogErrorHandler=n,this.defaultLogger=new wt}static logActionNoStrip(t,n,i,s){t.logAction(n,i,s)}logAction(t,n,i){this.shouldLog(t)&&(t===1?this.logErrorHandler:this.logHandler)("Ably: "+n+": "+i,t)}renamedClientOption(t,n){this.deprecationWarning(`The \`${t}\` client option has been renamed to \`${n}\`. Please update your code to use \`${n}\` instead. \`${t}\` will be removed in a future version.`)}renamedMethod(t,n,i){this.deprecationWarning(`\`${t}\`\u2019s \`${n}\` method has been renamed to \`${i}\`. Please update your code to use \`${i}\` instead. \`${n}\` will be removed in a future version.`)}deprecationWarning(t){this.shouldLog(1)&&this.logErrorHandler(`Ably: Deprecation warning - ${t}`,1)}};he.defaultLogLevel=1,he.LOG_NONE=0,he.LOG_ERROR=1,he.LOG_MAJOR=2,he.LOG_MINOR=3,he.LOG_MICRO=4,he.logAction=(e,t,n,i)=>{he.logActionNoStrip(e,t,n,i)};var Ee=he,o=Ee,re={};H(re,{Format:()=>ve,allSame:()=>X,allToLowerCase:()=>cn,allToUpperCase:()=>pi,arrChooseN:()=>fi,arrDeleteValue:()=>Pt,arrEquals:()=>_i,arrIntersect:()=>It,arrIntersectOb:()=>Et,arrPopRandomElement:()=>Y,arrSubtract:()=>on,arrWithoutValue:()=>an,cheapRandStr:()=>Lt,containsValue:()=>rn,copy:()=>ue,createMissingPluginError:()=>Nt,dataSizeBytes:()=>ui,decodeBody:()=>ke,encodeBody:()=>Te,ensureArray:()=>Qe,forInOwnNonNullProperties:()=>N,getBackoffCoefficient:()=>gi,getGlobalObject:()=>hn,getJitterCoefficient:()=>mi,getRetryTime:()=>ln,inherits:()=>sn,inspectBody:()=>hi,inspectError:()=>J,intersect:()=>xt,isEmpty:()=>Pe,isErrorInfoOrPartialErrorInfo:()=>lt,isNil:()=>ye,isObject:()=>de,keysArray:()=>Ke,matchDerivedChannel:()=>vi,mixin:()=>G,parseQueryString:()=>Le,prototypicalClone:()=>Mt,randomString:()=>di,shallowClone:()=>ze,shallowEquals:()=>yi,throwMissingPluginError:()=>we,toBase64:()=>Ut,toQueryString:()=>Se,valuesArray:()=>D,whenPromiseSettles:()=>_e,withTimeoutAsync:()=>bi});function Oe(e){let t="["+e.constructor.name;return e.message&&(t+=": "+e.message),e.statusCode&&(t+="; statusCode="+e.statusCode),e.code&&(t+="; code="+e.code),e.cause&&(t+="; cause="+J(e.cause)),e.href&&!(e.message&&e.message.indexOf("help.ably.io")>-1)&&(t+="; see "+e.href+" "),t+="]",t}var w=class Wn extends Error{constructor(t,n,i,s){super(t),typeof Object.setPrototypeOf<"u"&&Object.setPrototypeOf(this,Wn.prototype),this.code=n,this.statusCode=i,this.cause=s}toString(){return Oe(this)}static fromValues(t){let{message:n,code:i,statusCode:s}=t;if(typeof n!="string"||typeof i!="number"||typeof s!="number")throw new Error("ErrorInfo.fromValues(): invalid values: "+m.Config.inspect(t));let r=Object.assign(new Wn(n,i,s),t);return r.code&&!r.href&&(r.href="https://help.ably.io/error/"+r.code),r}},ce=class zn extends Error{constructor(t,n,i,s){super(t),typeof Object.setPrototypeOf<"u"&&Object.setPrototypeOf(this,zn.prototype),this.code=n,this.statusCode=i,this.cause=s}toString(){return Oe(this)}static fromValues(t){let{message:n,code:i,statusCode:s}=t;if(typeof n!="string"||!ye(i)&&typeof i!="number"||!ye(s)&&typeof s!="number")throw new Error("PartialErrorInfo.fromValues(): invalid values: "+m.Config.inspect(t));let r=Object.assign(new zn(n,i,s),t);return r.code&&!r.href&&(r.href="https://help.ably.io/error/"+r.code),r}};function Tt(e){return Math.floor(Math.random()*e.length)}function G(e,...t){for(let n=0;n<t.length;n++){let i=t[n];if(!i)break;for(let s in i)Object.prototype.hasOwnProperty.call(i,s)&&(e[s]=i[s])}return e}function ue(e){return G({},e)}function Qe(e){return ye(e)?[]:Array.isArray(e)?e:[e]}function de(e){return Object.prototype.toString.call(e)=="[object Object]"}function Pe(e){for(let t in e)return!1;return!0}function ye(e){return e==null}function ze(e){let t=new Object;for(let n in e)t[n]=e[n];return t}function Mt(e,t){class n{}n.prototype=e;let i=new n;return t&&G(i,t),i}var sn=function(e,t){if(m.Config.inherits){m.Config.inherits(e,t);return}e.super_=t,e.prototype=Mt(t.prototype,{constructor:e})};function rn(e,t){for(let n in e)if(e[n]==t)return!0;return!1}function xt(e,t){return Array.isArray(t)?It(e,t):Et(e,t)}function It(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i];t.indexOf(s)!=-1&&n.push(s)}return n}function Et(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i];s in t&&n.push(s)}return n}function on(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i];t.indexOf(s)==-1&&n.push(s)}return n}function Pt(e,t){let n=e.indexOf(t),i=n!=-1;return i&&e.splice(n,1),i}function an(e,t){let n=e.slice();return Pt(n,t),n}function Ke(e,t){let n=[];for(let i in e)t&&!Object.prototype.hasOwnProperty.call(e,i)||n.push(i);return n}function D(e,t){let n=[];for(let i in e)t&&!Object.prototype.hasOwnProperty.call(e,i)||n.push(e[i]);return n}function N(e,t){for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&e[n]&&t(n)}function X(e,t){if(e.length===0)return!0;let n=e[0][t];return e.every(function(i){return i[t]===n})}var ve=(e=>(e.msgpack="msgpack",e.json="json",e))(ve||{});function Y(e){return e.splice(Tt(e),1)[0]}function Se(e){let t=[];if(e)for(let n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.length?"?"+t.join("&"):""}function Le(e){let t,n=/([^?&=]+)=?([^&]*)/g,i={};for(;t=n.exec(e);)i[decodeURIComponent(t[1])]=decodeURIComponent(t[2]);return i}function lt(e){return typeof e=="object"&&e!==null&&(e instanceof w||e instanceof ce)}function J(e){var t,n;return e instanceof Error||((t=e?.constructor)==null?void 0:t.name)==="ErrorInfo"||((n=e?.constructor)==null?void 0:n.name)==="PartialErrorInfo"?e.toString():m.Config.inspect(e)}function hi(e){return m.BufferUtils.isBuffer(e)?e.toString():typeof e=="string"?e:m.Config.inspect(e)}function ui(e){if(m.BufferUtils.isBuffer(e))return m.BufferUtils.byteLength(e);if(typeof e=="string")return m.Config.stringByteSize(e);throw new Error("Expected input of Utils.dataSizeBytes to be a buffer or string, but was: "+typeof e)}function Lt(){return String(Math.random()).substr(2)}var di=async e=>{let t=await m.Config.getRandomArrayBuffer(e);return m.BufferUtils.base64Encode(t)};function fi(e,t){let n=Math.min(t,e.length),i=e.slice(),s=[];for(let r=0;r<n;r++)s.push(Y(i));return s}function _e(e,t){e.then(n=>{t?.(null,n)}).catch(n=>{t?.(n)})}function ke(e,t,n){return n=="msgpack"?(t||we("MsgPack"),t.decode(e)):JSON.parse(String(e))}function Te(e,t,n){return n=="msgpack"?(t||we("MsgPack"),t.encode(e,!0)):JSON.stringify(e)}function cn(e){return e.map(function(t){return t&&t.toLowerCase()})}function pi(e){return e.map(function(t){return t&&t.toUpperCase()})}function gi(e){return Math.min((e+2)/3,2)}function mi(){return 1-Math.random()*.2}function ln(e,t){return e*gi(t)*mi()}function hn(){return typeof global<"u"?global:typeof window<"u"?window:self}function yi(e,t){return Object.keys(e).every(n=>e[n]===t[n])&&Object.keys(t).every(n=>t[n]===e[n])}function vi(e){let t=/^(\[([^?]*)(?:(.*))\])?(.+)$/,n=e.match(t);if(!n||!n.length||n.length<5)throw new w("regex match failed",400,40010);if(n[2])throw new w(`cannot use a derived option with a ${n[2]} channel`,400,40010);return{qualifierParam:n[3]||"",channelName:n[4]}}function Ut(e){let t=m.BufferUtils,n=t.utf8Encode(e);return t.base64Encode(n)}function _i(e,t){return e.length===t.length&&e.every(function(n,i){return n===t[i]})}function Nt(e){return new w(`${e} plugin not provided`,40019,400)}function we(e){throw Nt(e)}async function bi(e,t=5e3,n="Timeout expired"){let i=new w(n,5e4,500);return Promise.race([e,new Promise((s,r)=>setTimeout(()=>r(i),t))])}var wi="2.6.0",Sr="ably-js/"+wi,fe={ENVIRONMENT:"",REST_HOST:"rest.ably.io",REALTIME_HOST:"realtime.ably.io",FALLBACK_HOSTS:["A.ably-realtime.com","B.ably-realtime.com","C.ably-realtime.com","D.ably-realtime.com","E.ably-realtime.com"],PORT:80,TLS_PORT:443,TIMEOUTS:{disconnectedRetryTimeout:15e3,suspendedRetryTimeout:3e4,httpRequestTimeout:1e4,httpMaxRetryDuration:15e3,channelRetryTimeout:15e3,fallbackRetryTimeout:6e5,connectionStateTtl:12e4,realtimeRequestTimeout:1e4,recvTimeout:9e4,webSocketConnectTimeout:1e4,webSocketSlowTimeout:4e3},httpMaxRetryCount:3,maxMessageSize:65536,version:wi,protocolVersion:3,agent:Sr,getHost:Ci,getPort:Tr,getHttpScheme:Mr,environmentFallbackHosts:Ri,getFallbackHosts:ki,getHosts:xr,checkHost:Ai,objectifyOptions:Pr,normaliseOptions:Lr,defaultGetHeaders:Ur,defaultPostHeaders:Nr};function Ci(e,t,n){return n?t=t==e.restHost&&e.realtimeHost||t||e.realtimeHost:t=t||e.restHost,t}function Tr(e,t){return t||e.tls?e.tlsPort:e.port}function Mr(e){return e.tls?"https://":"http://"}function Ri(e){return[e+"-a-fallback.ably-realtime.com",e+"-b-fallback.ably-realtime.com",e+"-c-fallback.ably-realtime.com",e+"-d-fallback.ably-realtime.com",e+"-e-fallback.ably-realtime.com"]}function ki(e){let t=e.fallbackHosts,n=typeof e.httpMaxRetryCount<"u"?e.httpMaxRetryCount:fe.httpMaxRetryCount;return t?fi(t,n):[]}function xr(e,t){let n=[e.restHost].concat(ki(e));return t?n.map(i=>Ci(e,i,!0)):n}function Ai(e){if(typeof e!="string")throw new w("host must be a string; was a "+typeof e,4e4,400);if(!e.length)throw new w("host must not be zero-length",4e4,400)}function Ir(e,t,n,i){return e.realtimeHost?e.realtimeHost:e.restHost?(o.logAction(i,o.LOG_MINOR,"Defaults.normaliseOptions",'restHost is set to "'+e.restHost+'" but realtimeHost is not set, so setting realtimeHost to "'+e.restHost+'" too. If this is not what you want, please set realtimeHost explicitly.'),e.restHost):t?fe.REALTIME_HOST:n+"-"+fe.REALTIME_HOST}function Er(e){let t={};for(let n in fe.TIMEOUTS)t[n]=e[n]||fe.TIMEOUTS[n];return t}function un(e){let t=fe.agent;if(e.agents)for(var n in e.agents)t+=" "+n+"/"+e.agents[n];return t}function Pr(e,t,n,i,s){if(e===void 0){let l=t?`${n} must be initialized with either a client options object, an Ably API key, or an Ably Token`:`${n} must be initialized with a client options object`;throw o.logAction(i,o.LOG_ERROR,`${n}()`,l),new Error(l)}let r;if(typeof e=="string")if(e.indexOf(":")==-1){if(!t){let l=`${n} cannot be initialized with just an Ably Token; you must provide a client options object with a \`plugins\` property. (Set this Ably Token as the object\u2019s \`token\` property.)`;throw o.logAction(i,o.LOG_ERROR,`${n}()`,l),new Error(l)}r={token:e}}else{if(!t){let l=`${n} cannot be initialized with just an Ably API key; you must provide a client options object with a \`plugins\` property. (Set this Ably API key as the object\u2019s \`key\` property.)`;throw o.logAction(i,o.LOG_ERROR,`${n}()`,l),new Error(l)}r={key:e}}else r=e;return s&&(r=E(y({},r),{plugins:y(y({},s),r.plugins)})),r}function Lr(e,t,n){let i=n??o.defaultLogger;typeof e.recover=="function"&&e.closeOnUnload===!0&&(o.logAction(i,o.LOG_ERROR,"Defaults.normaliseOptions","closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter"),e.recover=void 0),"closeOnUnload"in e||(e.closeOnUnload=!e.recover),"queueMessages"in e||(e.queueMessages=!0);let s=e.environment&&String(e.environment).toLowerCase()||fe.ENVIRONMENT,r=!s||s==="production";!e.fallbackHosts&&!e.restHost&&!e.realtimeHost&&!e.port&&!e.tlsPort&&(e.fallbackHosts=r?fe.FALLBACK_HOSTS:Ri(s));let l=e.restHost||(r?fe.REST_HOST:s+"-"+fe.REST_HOST),u=Ir(e,r,s,i);(e.fallbackHosts||[]).concat(l,u).forEach(Ai),e.port=e.port||fe.PORT,e.tlsPort=e.tlsPort||fe.TLS_PORT,"tls"in e||(e.tls=!0);let g=Er(e);t?"useBinaryProtocol"in e?e.useBinaryProtocol=m.Config.supportsBinary&&e.useBinaryProtocol:e.useBinaryProtocol=m.Config.preferBinary:e.useBinaryProtocol=!1;let f={};e.clientId&&(f["X-Ably-ClientId"]=m.BufferUtils.base64Encode(m.BufferUtils.utf8Encode(e.clientId))),"idempotentRestPublishing"in e||(e.idempotentRestPublishing=!0);let b=null,C=e.connectivityCheckUrl;if(e.connectivityCheckUrl){let[R,I]=e.connectivityCheckUrl.split("?");b=I?Le(I):{},R.indexOf("://")===-1&&(R="https://"+R),C=R}let O=e.wsConnectivityCheckUrl;return O&&O.indexOf("://")===-1&&(O="wss://"+O),E(y({},e),{realtimeHost:u,restHost:l,maxMessageSize:e.maxMessageSize||fe.maxMessageSize,timeouts:g,connectivityCheckParams:b,connectivityCheckUrl:C,wsConnectivityCheckUrl:O,headers:f})}function Bt(e,t,n){let i=n||{};if(i.cipher){e||we("Crypto");let s=e.getCipher(i.cipher,t);i.cipher=s.cipherParams,i.channelCipher=s.cipher}else"cipher"in i&&(i.cipher=void 0,i.channelCipher=null);return i}var Oi={json:"application/json",xml:"application/xml",html:"text/html",msgpack:"application/x-msgpack",text:"text/plain"},Gt={format:"json",protocolVersion:fe.protocolVersion};function Ur(e,{format:t=Gt.format,protocolVersion:n=Gt.protocolVersion}={}){return{accept:Oi[t],"X-Ably-Version":n.toString(),"Ably-Agent":un(e)}}function Nr(e,{format:t=Gt.format,protocolVersion:n=Gt.protocolVersion}={}){let i;return{accept:i=Oi[t],"content-type":i,"X-Ably-Version":n.toString(),"Ably-Agent":un(e)}}var U=fe;function Br(e){return Object.assign(fe,e)}var Gr=class Ts{constructor(t,n){this.logger=t,this.members=n||[]}call(t,n){for(let i of this.members)if(i)try{i(t,n)}catch(s){o.logAction(this.logger,o.LOG_ERROR,"Multicaster multiple callback handler","Unexpected exception: "+s+"; stack = "+s.stack)}}push(...t){this.members.push(...t)}createPromise(){return new Promise((t,n)=>{this.push((i,s)=>{i?n(i):t(s)})})}resolveAll(t){this.call(null,t)}rejectAll(t){this.call(t)}static create(t,n){let i=new Ts(t,n);return Object.assign((s,r)=>i.call(s,r),{push:s=>i.push(s),createPromise:()=>i.createPromise(),resolveAll:s=>i.resolveAll(s),rejectAll:s=>i.rejectAll(s)})}},dn=Gr,Si=(e=>(e.Get="get",e.Delete="delete",e.Post="post",e.Put="put",e.Patch="patch",e))(Si||{}),Z=Si,Ti=(e=>(e[e.Success=200]="Success",e[e.NoContent=204]="NoContent",e[e.BadRequest=400]="BadRequest",e[e.Unauthorized=401]="Unauthorized",e[e.Forbidden=403]="Forbidden",e[e.RequestTimeout=408]="RequestTimeout",e[e.InternalServerError=500]="InternalServerError",e))(Ti||{});function qr(e){return e>=200&&e<400}var qt=Ti,fn=Math.pow(2,17);function Dr(){return("000000"+Math.floor(Math.random()*1e16)).slice(-16)}function Hr(e){return!!e.connection}function Mi(e){return lt(e)?(e.code||(e.statusCode===403?e.code=40300:(e.code=40170,e.statusCode=401)),e):new w(J(e),e.code||40170,e.statusCode||401)}var Fr=(e,t)=>{let n=m.BufferUtils,i=n.utf8Encode(e),s=n.utf8Encode(t),r=n.hmacSha256(i,s);return n.base64Encode(r)};function xi(e){if(!e)return"";typeof e=="string"&&(e=JSON.parse(e));let t=Object.create(null),n=Ke(e,!0);if(!n)return"";n.sort();for(let i=0;i<n.length;i++)t[n[i]]=e[n[i]].sort();return JSON.stringify(t)}function Ii(e,t){if(e.authCallback)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with authCallback");else if(e.authUrl)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with authUrl");else if(e.key)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with client-side signing");else if(e.tokenDetails)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with supplied token only");else{let n="authOptions must include valid authentication parameters";throw o.logAction(t,o.LOG_ERROR,"Auth()",n),new Error(n)}}function jr(e){return"useTokenAuth"in e&&!e.useTokenAuth}function Ei(e){return e.useTokenAuth||!jr(e)&&(e.authCallback||e.authUrl||e.token||e.tokenDetails)}function Vr(e){return!e.key&&!e.authCallback&&!e.authUrl}var Wr=0;function zr(){return Wr++}var Kr=class{constructor(e,t){if(this.authOptions={},this.client=e,this.tokenParams=t.defaultTokenParams||{},this.currentTokenRequestId=null,this.waitingForTokenRequest=null,Ei(t))Vr(t)&&o.logAction(this.logger,o.LOG_ERROR,"Auth()","Warning: library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),this._saveTokenOptions(t.defaultTokenParams,t),Ii(this.authOptions,this.logger);else{if(!t.key){let n="No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)";throw o.logAction(this.logger,o.LOG_ERROR,"Auth()",n),new w(n,40160,401)}o.logAction(this.logger,o.LOG_MINOR,"Auth()","anonymous, using basic auth"),this._saveBasicOptions(t)}}get logger(){return this.client.logger}async authorize(e,t){if(t&&t.key&&this.authOptions.key!==t.key)throw new w("Unable to update auth options with incompatible key",40102,401);try{let n=await this._forceNewToken(e??null,t??null);return Hr(this.client)?new Promise((i,s)=>{this.client.connection.connectionManager.onAuthUpdated(n,(r,l)=>r?s(r):i(l))}):n}catch(n){throw this.client.connection&&n.statusCode===qt.Forbidden&&this.client.connection.connectionManager.actOnErrorFromAuthorize(n),n}}async _forceNewToken(e,t){this.tokenDetails=null,this._saveTokenOptions(e,t),Ii(this.authOptions,this.logger);try{return this._ensureValidAuthCredentials(!0)}finally{delete this.tokenParams.timestamp,delete this.authOptions.queryTime}}async requestToken(e,t){let n=t||this.authOptions,i=e||ue(this.tokenParams),s,r=this.client;if(n.authCallback)o.logAction(this.logger,o.LOG_MINOR,"Auth.requestToken()","using token auth with authCallback"),s=n.authCallback;else if(n.authUrl)o.logAction(this.logger,o.LOG_MINOR,"Auth.requestToken()","using token auth with authUrl"),s=(u,g)=>{let f=G({accept:"application/json, text/plain"},n.authHeaders),b=n.authMethod&&n.authMethod.toLowerCase()==="post",C,O=n.authUrl.indexOf("?");O>-1&&(C=Le(n.authUrl.slice(O)),n.authUrl=n.authUrl.slice(0,O),b||(n.authParams=G(C,n.authParams)));let R=G({},n.authParams||{},u),I=x=>{var L,j;let K=(L=x.body)!=null?L:null,$=null;if(x.error)o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().tokenRequestCallback","Received Error: "+J(x.error));else{let ge=(j=x.headers["content-type"])!=null?j:null;Array.isArray(ge)?$=ge.join(", "):$=ge,o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().tokenRequestCallback","Received; content-type: "+$+"; body: "+hi(K))}if(x.error){g(x.error,null);return}if(x.unpacked){g(null,K);return}if(m.BufferUtils.isBuffer(K)&&(K=K.toString()),!$){g(new w("authUrl response is missing a content-type header",40170,401),null);return}let B=$.indexOf("application/json")>-1,Ce=$.indexOf("text/plain")>-1||$.indexOf("application/jwt")>-1;if(!B&&!Ce){g(new w("authUrl responded with unacceptable content-type "+$+", should be either text/plain, application/jwt or application/json",40170,401),null);return}if(B){if(K.length>fn){g(new w("authUrl response exceeded max permitted length",40170,401),null);return}try{K=JSON.parse(K)}catch(ge){g(new w("Unexpected error processing authURL response; err = "+ge.message,40170,401),null);return}}g(null,K,$)};if(o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().tokenRequestCallback","Requesting token from "+n.authUrl+"; Params: "+JSON.stringify(R)+"; method: "+(b?"POST":"GET")),b){let x=f||{};x["content-type"]="application/x-www-form-urlencoded";let L=Se(R).slice(1);_e(this.client.http.doUri(Z.Post,n.authUrl,x,L,C),(j,K)=>I(j||K))}else _e(this.client.http.doUri(Z.Get,n.authUrl,f||{},null,R),(x,L)=>I(x||L))};else if(n.key)o.logAction(this.logger,o.LOG_MINOR,"Auth.requestToken()","using token auth with client-side signing"),s=(u,g)=>{_e(this.createTokenRequest(u,n),(f,b)=>g(f,b??null))};else{let u="Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)";throw o.logAction(this.logger,o.LOG_ERROR,"Auth()","library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),new w(u,40171,403)}"capability"in i&&(i.capability=xi(i.capability));let l=(u,g)=>{let f=u.keyName,b="/keys/"+f+"/requestToken",C=function(R){return r.baseUri(R)+b},O=U.defaultPostHeaders(this.client.options);n.requestHeaders&&G(O,n.requestHeaders),o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().requestToken","Sending POST to "+b+"; Token params: "+JSON.stringify(u)),_e(this.client.http.do(Z.Post,C,O,JSON.stringify(u),null),(R,I)=>R?g(R):g(I.error,I.body,I.unpacked))};return new Promise((u,g)=>{let f=!1,b=this.client.options.timeouts.realtimeRequestTimeout,C=setTimeout(()=>{f=!0;let O="Token request callback timed out after "+b/1e3+" seconds";o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()",O),g(new w(O,40170,401))},b);s(i,(O,R,I)=>{if(f)return;if(clearTimeout(C),O){o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()","token request signing call returned error; err = "+J(O)),g(Mi(O));return}if(typeof R=="string"){R.length===0?g(new w("Token string is empty",40170,401)):R.length>fn?g(new w("Token string exceeded max permitted length (was "+R.length+" bytes)",40170,401)):R==="undefined"||R==="null"?g(new w("Token string was literal null/undefined",40170,401)):R[0]==="{"&&!(I&&I.indexOf("application/jwt")>-1)?g(new w("Token was double-encoded; make sure you're not JSON-encoding an already encoded token request or details",40170,401)):u({token:R});return}if(typeof R!="object"||R===null){let L="Expected token request callback to call back with a token string or token request/details object, but got a "+typeof R;o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()",L),g(new w(L,40170,401));return}let x=JSON.stringify(R).length;if(x>fn&&!n.suppressMaxLengthCheck){g(new w("Token request/details object exceeded max permitted stringified size (was "+x+" bytes)",40170,401));return}if("issued"in R){u(R);return}if(!("keyName"in R)){let L="Expected token request callback to call back with a token string, token request object, or token details object";o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()",L),g(new w(L,40170,401));return}l(R,(L,j,K)=>{if(L){o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()","token request API call returned error; err = "+J(L)),g(Mi(L));return}K||(j=JSON.parse(j)),o.logAction(this.logger,o.LOG_MINOR,"Auth.getToken()","token received"),u(j)})})})}async createTokenRequest(e,t){t=t||this.authOptions,e=e||ue(this.tokenParams);let n=t.key;if(!n)throw new w("No key specified",40101,403);let i=n.split(":"),s=i[0],r=i[1];if(!r)throw new w("Invalid key specified",40101,403);if(e.clientId==="")throw new w("clientId can\u2019t be an empty string",40012,400);"capability"in e&&(e.capability=xi(e.capability));let l=G({keyName:s},e),u=e.clientId||"",g=e.ttl||"",f=e.capability||"";l.timestamp||(l.timestamp=await this.getTimestamp(t&&t.queryTime));let b=l.nonce||(l.nonce=Dr()),C=l.timestamp,O=l.keyName+`
1
+ "use strict";var BaseportalChatSDK=(()=>{var uc=Object.create;var Vt=Object.defineProperty;var dc=Object.getOwnPropertyDescriptor;var fc=Object.getOwnPropertyNames;var pc=Object.getPrototypeOf,gc=Object.prototype.hasOwnProperty;var mc=(c,a)=>()=>(a||c((a={exports:{}}).exports,a),a.exports),yc=(c,a)=>{for(var h in a)Vt(c,h,{get:a[h],enumerable:!0})},Ss=(c,a,h,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of fc(a))!gc.call(c,p)&&p!==h&&Vt(c,p,{get:()=>a[p],enumerable:!(d=dc(a,p))||d.enumerable});return c};var vc=(c,a,h)=>(h=c!=null?uc(pc(c)):{},Ss(a||!c||!c.__esModule?Vt(h,"default",{value:c,enumerable:!0}):h,c)),_c=c=>Ss(Vt({},"__esModule",{value:!0}),c);var Ls=mc((Rt,Jn)=>{"use strict";(function(c,a){typeof Rt=="object"&&typeof Jn=="object"?Jn.exports=a():typeof define=="function"&&define.amd?define([],a):typeof Rt=="object"?Rt.Ably=a():c.Ably=a()})(Rt,()=>{var c={},a={exports:c},h=Object.defineProperty,d=Object.defineProperties,p=Object.getOwnPropertyDescriptor,v=Object.getOwnPropertyDescriptors,A=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols,M=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable,P=(e,t,n)=>t in e?h(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,y=(e,t)=>{for(var n in t||(t={}))M.call(t,n)&&P(e,n,t[n]);if(T)for(var n of T(t))k.call(t,n)&&P(e,n,t[n]);return e},E=(e,t)=>d(e,v(t)),S=(e,t)=>{var n={};for(var i in e)M.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(e!=null&&T)for(var i of T(e))t.indexOf(i)<0&&k.call(e,i)&&(n[i]=e[i]);return n},H=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},ne=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of A(t))!M.call(e,s)&&s!==n&&h(e,s,{get:()=>t[s],enumerable:!(i=p(t,s))||i.enumerable});return e},K=e=>ne(h({},"__esModule",{value:!0}),e),F={};H(F,{ErrorInfo:()=>w,Realtime:()=>Ln,Rest:()=>Cn,default:()=>lc,msgpack:()=>jn,protocolMessageFromDeserialized:()=>Wo}),a.exports=K(F);var m=class{},V=typeof global<"u"?global:typeof window<"u"?window:self;function Q(e,t){return`${e}`.padStart(t?3:2,"0")}function pe(e){return m.Config.logTimestamps?function(t){let n=new Date;e(Q(n.getHours())+":"+Q(n.getMinutes())+":"+Q(n.getSeconds())+"."+Q(n.getMilliseconds(),1)+" "+t)}:function(t){e(t)}}var le=()=>{var e;let t,n;return typeof((e=V?.console)==null?void 0:e.log)=="function"?(t=function(...i){console.log.apply(console,i)},n=console.warn?function(...i){console.warn.apply(console,i)}:t):t=n=function(){},[t,n].map(pe)},he=class wt{constructor(){this.deprecated=(t,n)=>{this.deprecationWarning(`${t} is deprecated and will be removed in a future version. ${n}`)},this.shouldLog=t=>t<=this.logLevel,this.setLog=(t,n)=>{t!==void 0&&(this.logLevel=t),n!==void 0&&(this.logHandler=this.logErrorHandler=n)},this.logLevel=wt.defaultLogLevel,this.logHandler=wt.defaultLogHandler,this.logErrorHandler=wt.defaultLogErrorHandler}static initLogHandlers(){let[t,n]=le();this.defaultLogHandler=t,this.defaultLogErrorHandler=n,this.defaultLogger=new wt}static logActionNoStrip(t,n,i,s){t.logAction(n,i,s)}logAction(t,n,i){this.shouldLog(t)&&(t===1?this.logErrorHandler:this.logHandler)("Ably: "+n+": "+i,t)}renamedClientOption(t,n){this.deprecationWarning(`The \`${t}\` client option has been renamed to \`${n}\`. Please update your code to use \`${n}\` instead. \`${t}\` will be removed in a future version.`)}renamedMethod(t,n,i){this.deprecationWarning(`\`${t}\`\u2019s \`${n}\` method has been renamed to \`${i}\`. Please update your code to use \`${i}\` instead. \`${n}\` will be removed in a future version.`)}deprecationWarning(t){this.shouldLog(1)&&this.logErrorHandler(`Ably: Deprecation warning - ${t}`,1)}};he.defaultLogLevel=1,he.LOG_NONE=0,he.LOG_ERROR=1,he.LOG_MAJOR=2,he.LOG_MINOR=3,he.LOG_MICRO=4,he.logAction=(e,t,n,i)=>{he.logActionNoStrip(e,t,n,i)};var Pe=he,o=Pe,re={};H(re,{Format:()=>ve,allSame:()=>X,allToLowerCase:()=>cn,allToUpperCase:()=>pi,arrChooseN:()=>fi,arrDeleteValue:()=>Pt,arrEquals:()=>_i,arrIntersect:()=>It,arrIntersectOb:()=>Et,arrPopRandomElement:()=>Y,arrSubtract:()=>on,arrWithoutValue:()=>an,cheapRandStr:()=>Lt,containsValue:()=>rn,copy:()=>ge,createMissingPluginError:()=>Nt,dataSizeBytes:()=>ui,decodeBody:()=>Ae,encodeBody:()=>Me,ensureArray:()=>ct,forInOwnNonNullProperties:()=>N,getBackoffCoefficient:()=>gi,getGlobalObject:()=>hn,getJitterCoefficient:()=>mi,getRetryTime:()=>ln,inherits:()=>sn,inspectBody:()=>hi,inspectError:()=>J,intersect:()=>xt,isEmpty:()=>Le,isErrorInfoOrPartialErrorInfo:()=>lt,isNil:()=>ye,isObject:()=>me,keysArray:()=>Ke,matchDerivedChannel:()=>vi,mixin:()=>G,parseQueryString:()=>we,prototypicalClone:()=>Mt,randomString:()=>di,shallowClone:()=>ze,shallowEquals:()=>yi,throwMissingPluginError:()=>Ce,toBase64:()=>Ut,toQueryString:()=>Te,valuesArray:()=>D,whenPromiseSettles:()=>_e,withTimeoutAsync:()=>bi});function Se(e){let t="["+e.constructor.name;return e.message&&(t+=": "+e.message),e.statusCode&&(t+="; statusCode="+e.statusCode),e.code&&(t+="; code="+e.code),e.cause&&(t+="; cause="+J(e.cause)),e.href&&!(e.message&&e.message.indexOf("help.ably.io")>-1)&&(t+="; see "+e.href+" "),t+="]",t}var w=class Vn extends Error{constructor(t,n,i,s){super(t),typeof Object.setPrototypeOf<"u"&&Object.setPrototypeOf(this,Vn.prototype),this.code=n,this.statusCode=i,this.cause=s}toString(){return Se(this)}static fromValues(t){let{message:n,code:i,statusCode:s}=t;if(typeof n!="string"||typeof i!="number"||typeof s!="number")throw new Error("ErrorInfo.fromValues(): invalid values: "+m.Config.inspect(t));let r=Object.assign(new Vn(n,i,s),t);return r.code&&!r.href&&(r.href="https://help.ably.io/error/"+r.code),r}},ce=class zn extends Error{constructor(t,n,i,s){super(t),typeof Object.setPrototypeOf<"u"&&Object.setPrototypeOf(this,zn.prototype),this.code=n,this.statusCode=i,this.cause=s}toString(){return Se(this)}static fromValues(t){let{message:n,code:i,statusCode:s}=t;if(typeof n!="string"||!ye(i)&&typeof i!="number"||!ye(s)&&typeof s!="number")throw new Error("PartialErrorInfo.fromValues(): invalid values: "+m.Config.inspect(t));let r=Object.assign(new zn(n,i,s),t);return r.code&&!r.href&&(r.href="https://help.ably.io/error/"+r.code),r}};function Tt(e){return Math.floor(Math.random()*e.length)}function G(e,...t){for(let n=0;n<t.length;n++){let i=t[n];if(!i)break;for(let s in i)Object.prototype.hasOwnProperty.call(i,s)&&(e[s]=i[s])}return e}function ge(e){return G({},e)}function ct(e){return ye(e)?[]:Array.isArray(e)?e:[e]}function me(e){return Object.prototype.toString.call(e)=="[object Object]"}function Le(e){for(let t in e)return!1;return!0}function ye(e){return e==null}function ze(e){let t=new Object;for(let n in e)t[n]=e[n];return t}function Mt(e,t){class n{}n.prototype=e;let i=new n;return t&&G(i,t),i}var sn=function(e,t){if(m.Config.inherits){m.Config.inherits(e,t);return}e.super_=t,e.prototype=Mt(t.prototype,{constructor:e})};function rn(e,t){for(let n in e)if(e[n]==t)return!0;return!1}function xt(e,t){return Array.isArray(t)?It(e,t):Et(e,t)}function It(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i];t.indexOf(s)!=-1&&n.push(s)}return n}function Et(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i];s in t&&n.push(s)}return n}function on(e,t){let n=[];for(let i=0;i<e.length;i++){let s=e[i];t.indexOf(s)==-1&&n.push(s)}return n}function Pt(e,t){let n=e.indexOf(t),i=n!=-1;return i&&e.splice(n,1),i}function an(e,t){let n=e.slice();return Pt(n,t),n}function Ke(e,t){let n=[];for(let i in e)t&&!Object.prototype.hasOwnProperty.call(e,i)||n.push(i);return n}function D(e,t){let n=[];for(let i in e)t&&!Object.prototype.hasOwnProperty.call(e,i)||n.push(e[i]);return n}function N(e,t){for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&e[n]&&t(n)}function X(e,t){if(e.length===0)return!0;let n=e[0][t];return e.every(function(i){return i[t]===n})}var ve=(e=>(e.msgpack="msgpack",e.json="json",e))(ve||{});function Y(e){return e.splice(Tt(e),1)[0]}function Te(e){let t=[];if(e)for(let n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.length?"?"+t.join("&"):""}function we(e){let t,n=/([^?&=]+)=?([^&]*)/g,i={};for(;t=n.exec(e);)i[decodeURIComponent(t[1])]=decodeURIComponent(t[2]);return i}function lt(e){return typeof e=="object"&&e!==null&&(e instanceof w||e instanceof ce)}function J(e){var t,n;return e instanceof Error||((t=e?.constructor)==null?void 0:t.name)==="ErrorInfo"||((n=e?.constructor)==null?void 0:n.name)==="PartialErrorInfo"?e.toString():m.Config.inspect(e)}function hi(e){return m.BufferUtils.isBuffer(e)?e.toString():typeof e=="string"?e:m.Config.inspect(e)}function ui(e){if(m.BufferUtils.isBuffer(e))return m.BufferUtils.byteLength(e);if(typeof e=="string")return m.Config.stringByteSize(e);throw new Error("Expected input of Utils.dataSizeBytes to be a buffer or string, but was: "+typeof e)}function Lt(){return String(Math.random()).substr(2)}var di=async e=>{let t=await m.Config.getRandomArrayBuffer(e);return m.BufferUtils.base64Encode(t)};function fi(e,t){let n=Math.min(t,e.length),i=e.slice(),s=[];for(let r=0;r<n;r++)s.push(Y(i));return s}function _e(e,t){e.then(n=>{t?.(null,n)}).catch(n=>{t?.(n)})}function Ae(e,t,n){return n=="msgpack"?(t||Ce("MsgPack"),t.decode(e)):JSON.parse(String(e))}function Me(e,t,n){return n=="msgpack"?(t||Ce("MsgPack"),t.encode(e,!0)):JSON.stringify(e)}function cn(e){return e.map(function(t){return t&&t.toLowerCase()})}function pi(e){return e.map(function(t){return t&&t.toUpperCase()})}function gi(e){return Math.min((e+2)/3,2)}function mi(){return 1-Math.random()*.2}function ln(e,t){return e*gi(t)*mi()}function hn(){return typeof global<"u"?global:typeof window<"u"?window:self}function yi(e,t){return Object.keys(e).every(n=>e[n]===t[n])&&Object.keys(t).every(n=>t[n]===e[n])}function vi(e){let t=/^(\[([^?]*)(?:(.*))\])?(.+)$/,n=e.match(t);if(!n||!n.length||n.length<5)throw new w("regex match failed",400,40010);if(n[2])throw new w(`cannot use a derived option with a ${n[2]} channel`,400,40010);return{qualifierParam:n[3]||"",channelName:n[4]}}function Ut(e){let t=m.BufferUtils,n=t.utf8Encode(e);return t.base64Encode(n)}function _i(e,t){return e.length===t.length&&e.every(function(n,i){return n===t[i]})}function Nt(e){return new w(`${e} plugin not provided`,40019,400)}function Ce(e){throw Nt(e)}async function bi(e,t=5e3,n="Timeout expired"){let i=new w(n,5e4,500);return Promise.race([e,new Promise((s,r)=>setTimeout(()=>r(i),t))])}var wi="2.6.0",Sr="ably-js/"+wi,ue={ENVIRONMENT:"",REST_HOST:"rest.ably.io",REALTIME_HOST:"realtime.ably.io",FALLBACK_HOSTS:["A.ably-realtime.com","B.ably-realtime.com","C.ably-realtime.com","D.ably-realtime.com","E.ably-realtime.com"],PORT:80,TLS_PORT:443,TIMEOUTS:{disconnectedRetryTimeout:15e3,suspendedRetryTimeout:3e4,httpRequestTimeout:1e4,httpMaxRetryDuration:15e3,channelRetryTimeout:15e3,fallbackRetryTimeout:6e5,connectionStateTtl:12e4,realtimeRequestTimeout:1e4,recvTimeout:9e4,webSocketConnectTimeout:1e4,webSocketSlowTimeout:4e3},httpMaxRetryCount:3,maxMessageSize:65536,version:wi,protocolVersion:3,agent:Sr,getHost:Ci,getPort:Tr,getHttpScheme:Mr,environmentFallbackHosts:Ri,getFallbackHosts:ki,getHosts:xr,checkHost:Ai,objectifyOptions:Pr,normaliseOptions:Lr,defaultGetHeaders:Ur,defaultPostHeaders:Nr};function Ci(e,t,n){return n?t=t==e.restHost&&e.realtimeHost||t||e.realtimeHost:t=t||e.restHost,t}function Tr(e,t){return t||e.tls?e.tlsPort:e.port}function Mr(e){return e.tls?"https://":"http://"}function Ri(e){return[e+"-a-fallback.ably-realtime.com",e+"-b-fallback.ably-realtime.com",e+"-c-fallback.ably-realtime.com",e+"-d-fallback.ably-realtime.com",e+"-e-fallback.ably-realtime.com"]}function ki(e){let t=e.fallbackHosts,n=typeof e.httpMaxRetryCount<"u"?e.httpMaxRetryCount:ue.httpMaxRetryCount;return t?fi(t,n):[]}function xr(e,t){let n=[e.restHost].concat(ki(e));return t?n.map(i=>Ci(e,i,!0)):n}function Ai(e){if(typeof e!="string")throw new w("host must be a string; was a "+typeof e,4e4,400);if(!e.length)throw new w("host must not be zero-length",4e4,400)}function Ir(e,t,n,i){return e.realtimeHost?e.realtimeHost:e.restHost?(o.logAction(i,o.LOG_MINOR,"Defaults.normaliseOptions",'restHost is set to "'+e.restHost+'" but realtimeHost is not set, so setting realtimeHost to "'+e.restHost+'" too. If this is not what you want, please set realtimeHost explicitly.'),e.restHost):t?ue.REALTIME_HOST:n+"-"+ue.REALTIME_HOST}function Er(e){let t={};for(let n in ue.TIMEOUTS)t[n]=e[n]||ue.TIMEOUTS[n];return t}function un(e){let t=ue.agent;if(e.agents)for(var n in e.agents)t+=" "+n+"/"+e.agents[n];return t}function Pr(e,t,n,i,s){if(e===void 0){let l=t?`${n} must be initialized with either a client options object, an Ably API key, or an Ably Token`:`${n} must be initialized with a client options object`;throw o.logAction(i,o.LOG_ERROR,`${n}()`,l),new Error(l)}let r;if(typeof e=="string")if(e.indexOf(":")==-1){if(!t){let l=`${n} cannot be initialized with just an Ably Token; you must provide a client options object with a \`plugins\` property. (Set this Ably Token as the object\u2019s \`token\` property.)`;throw o.logAction(i,o.LOG_ERROR,`${n}()`,l),new Error(l)}r={token:e}}else{if(!t){let l=`${n} cannot be initialized with just an Ably API key; you must provide a client options object with a \`plugins\` property. (Set this Ably API key as the object\u2019s \`key\` property.)`;throw o.logAction(i,o.LOG_ERROR,`${n}()`,l),new Error(l)}r={key:e}}else r=e;return s&&(r=E(y({},r),{plugins:y(y({},s),r.plugins)})),r}function Lr(e,t,n){let i=n??o.defaultLogger;typeof e.recover=="function"&&e.closeOnUnload===!0&&(o.logAction(i,o.LOG_ERROR,"Defaults.normaliseOptions","closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter"),e.recover=void 0),"closeOnUnload"in e||(e.closeOnUnload=!e.recover),"queueMessages"in e||(e.queueMessages=!0);let s=e.environment&&String(e.environment).toLowerCase()||ue.ENVIRONMENT,r=!s||s==="production";!e.fallbackHosts&&!e.restHost&&!e.realtimeHost&&!e.port&&!e.tlsPort&&(e.fallbackHosts=r?ue.FALLBACK_HOSTS:Ri(s));let l=e.restHost||(r?ue.REST_HOST:s+"-"+ue.REST_HOST),u=Ir(e,r,s,i);(e.fallbackHosts||[]).concat(l,u).forEach(Ai),e.port=e.port||ue.PORT,e.tlsPort=e.tlsPort||ue.TLS_PORT,"tls"in e||(e.tls=!0);let g=Er(e);t?"useBinaryProtocol"in e?e.useBinaryProtocol=m.Config.supportsBinary&&e.useBinaryProtocol:e.useBinaryProtocol=m.Config.preferBinary:e.useBinaryProtocol=!1;let f={};e.clientId&&(f["X-Ably-ClientId"]=m.BufferUtils.base64Encode(m.BufferUtils.utf8Encode(e.clientId))),"idempotentRestPublishing"in e||(e.idempotentRestPublishing=!0);let b=null,C=e.connectivityCheckUrl;if(e.connectivityCheckUrl){let[R,I]=e.connectivityCheckUrl.split("?");b=I?we(I):{},R.indexOf("://")===-1&&(R="https://"+R),C=R}let O=e.wsConnectivityCheckUrl;return O&&O.indexOf("://")===-1&&(O="wss://"+O),E(y({},e),{realtimeHost:u,restHost:l,maxMessageSize:e.maxMessageSize||ue.maxMessageSize,timeouts:g,connectivityCheckParams:b,connectivityCheckUrl:C,wsConnectivityCheckUrl:O,headers:f})}function Bt(e,t,n){let i=n||{};if(i.cipher){e||Ce("Crypto");let s=e.getCipher(i.cipher,t);i.cipher=s.cipherParams,i.channelCipher=s.cipher}else"cipher"in i&&(i.cipher=void 0,i.channelCipher=null);return i}var Oi={json:"application/json",xml:"application/xml",html:"text/html",msgpack:"application/x-msgpack",text:"text/plain"},Gt={format:"json",protocolVersion:ue.protocolVersion};function Ur(e,{format:t=Gt.format,protocolVersion:n=Gt.protocolVersion}={}){return{accept:Oi[t],"X-Ably-Version":n.toString(),"Ably-Agent":un(e)}}function Nr(e,{format:t=Gt.format,protocolVersion:n=Gt.protocolVersion}={}){let i;return{accept:i=Oi[t],"content-type":i,"X-Ably-Version":n.toString(),"Ably-Agent":un(e)}}var U=ue;function Br(e){return Object.assign(ue,e)}var Gr=class Ts{constructor(t,n){this.logger=t,this.members=n||[]}call(t,n){for(let i of this.members)if(i)try{i(t,n)}catch(s){o.logAction(this.logger,o.LOG_ERROR,"Multicaster multiple callback handler","Unexpected exception: "+s+"; stack = "+s.stack)}}push(...t){this.members.push(...t)}createPromise(){return new Promise((t,n)=>{this.push((i,s)=>{i?n(i):t(s)})})}resolveAll(t){this.call(null,t)}rejectAll(t){this.call(t)}static create(t,n){let i=new Ts(t,n);return Object.assign((s,r)=>i.call(s,r),{push:s=>i.push(s),createPromise:()=>i.createPromise(),resolveAll:s=>i.resolveAll(s),rejectAll:s=>i.rejectAll(s)})}},dn=Gr,Si=(e=>(e.Get="get",e.Delete="delete",e.Post="post",e.Put="put",e.Patch="patch",e))(Si||{}),Z=Si,Ti=(e=>(e[e.Success=200]="Success",e[e.NoContent=204]="NoContent",e[e.BadRequest=400]="BadRequest",e[e.Unauthorized=401]="Unauthorized",e[e.Forbidden=403]="Forbidden",e[e.RequestTimeout=408]="RequestTimeout",e[e.InternalServerError=500]="InternalServerError",e))(Ti||{});function qr(e){return e>=200&&e<400}var qt=Ti,fn=Math.pow(2,17);function Dr(){return("000000"+Math.floor(Math.random()*1e16)).slice(-16)}function Hr(e){return!!e.connection}function Mi(e){return lt(e)?(e.code||(e.statusCode===403?e.code=40300:(e.code=40170,e.statusCode=401)),e):new w(J(e),e.code||40170,e.statusCode||401)}var Fr=(e,t)=>{let n=m.BufferUtils,i=n.utf8Encode(e),s=n.utf8Encode(t),r=n.hmacSha256(i,s);return n.base64Encode(r)};function xi(e){if(!e)return"";typeof e=="string"&&(e=JSON.parse(e));let t=Object.create(null),n=Ke(e,!0);if(!n)return"";n.sort();for(let i=0;i<n.length;i++)t[n[i]]=e[n[i]].sort();return JSON.stringify(t)}function Ii(e,t){if(e.authCallback)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with authCallback");else if(e.authUrl)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with authUrl");else if(e.key)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with client-side signing");else if(e.tokenDetails)o.logAction(t,o.LOG_MINOR,"Auth()","using token auth with supplied token only");else{let n="authOptions must include valid authentication parameters";throw o.logAction(t,o.LOG_ERROR,"Auth()",n),new Error(n)}}function jr(e){return"useTokenAuth"in e&&!e.useTokenAuth}function Ei(e){return e.useTokenAuth||!jr(e)&&(e.authCallback||e.authUrl||e.token||e.tokenDetails)}function Wr(e){return!e.key&&!e.authCallback&&!e.authUrl}var Vr=0;function zr(){return Vr++}var Kr=class{constructor(e,t){if(this.authOptions={},this.client=e,this.tokenParams=t.defaultTokenParams||{},this.currentTokenRequestId=null,this.waitingForTokenRequest=null,Ei(t))Wr(t)&&o.logAction(this.logger,o.LOG_ERROR,"Auth()","Warning: library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),this._saveTokenOptions(t.defaultTokenParams,t),Ii(this.authOptions,this.logger);else{if(!t.key){let n="No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)";throw o.logAction(this.logger,o.LOG_ERROR,"Auth()",n),new w(n,40160,401)}o.logAction(this.logger,o.LOG_MINOR,"Auth()","anonymous, using basic auth"),this._saveBasicOptions(t)}}get logger(){return this.client.logger}async authorize(e,t){if(t&&t.key&&this.authOptions.key!==t.key)throw new w("Unable to update auth options with incompatible key",40102,401);try{let n=await this._forceNewToken(e??null,t??null);return Hr(this.client)?new Promise((i,s)=>{this.client.connection.connectionManager.onAuthUpdated(n,(r,l)=>r?s(r):i(l))}):n}catch(n){throw this.client.connection&&n.statusCode===qt.Forbidden&&this.client.connection.connectionManager.actOnErrorFromAuthorize(n),n}}async _forceNewToken(e,t){this.tokenDetails=null,this._saveTokenOptions(e,t),Ii(this.authOptions,this.logger);try{return this._ensureValidAuthCredentials(!0)}finally{delete this.tokenParams.timestamp,delete this.authOptions.queryTime}}async requestToken(e,t){let n=t||this.authOptions,i=e||ge(this.tokenParams),s,r=this.client;if(n.authCallback)o.logAction(this.logger,o.LOG_MINOR,"Auth.requestToken()","using token auth with authCallback"),s=n.authCallback;else if(n.authUrl)o.logAction(this.logger,o.LOG_MINOR,"Auth.requestToken()","using token auth with authUrl"),s=(u,g)=>{let f=G({accept:"application/json, text/plain"},n.authHeaders),b=n.authMethod&&n.authMethod.toLowerCase()==="post",C,O=n.authUrl.indexOf("?");O>-1&&(C=we(n.authUrl.slice(O)),n.authUrl=n.authUrl.slice(0,O),b||(n.authParams=G(C,n.authParams)));let R=G({},n.authParams||{},u),I=x=>{var L,j;let z=(L=x.body)!=null?L:null,$=null;if(x.error)o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().tokenRequestCallback","Received Error: "+J(x.error));else{let fe=(j=x.headers["content-type"])!=null?j:null;Array.isArray(fe)?$=fe.join(", "):$=fe,o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().tokenRequestCallback","Received; content-type: "+$+"; body: "+hi(z))}if(x.error){g(x.error,null);return}if(x.unpacked){g(null,z);return}if(m.BufferUtils.isBuffer(z)&&(z=z.toString()),!$){g(new w("authUrl response is missing a content-type header",40170,401),null);return}let B=$.indexOf("application/json")>-1,Re=$.indexOf("text/plain")>-1||$.indexOf("application/jwt")>-1;if(!B&&!Re){g(new w("authUrl responded with unacceptable content-type "+$+", should be either text/plain, application/jwt or application/json",40170,401),null);return}if(B){if(z.length>fn){g(new w("authUrl response exceeded max permitted length",40170,401),null);return}try{z=JSON.parse(z)}catch(fe){g(new w("Unexpected error processing authURL response; err = "+fe.message,40170,401),null);return}}g(null,z,$)};if(o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().tokenRequestCallback","Requesting token from "+n.authUrl+"; Params: "+JSON.stringify(R)+"; method: "+(b?"POST":"GET")),b){let x=f||{};x["content-type"]="application/x-www-form-urlencoded";let L=Te(R).slice(1);_e(this.client.http.doUri(Z.Post,n.authUrl,x,L,C),(j,z)=>I(j||z))}else _e(this.client.http.doUri(Z.Get,n.authUrl,f||{},null,R),(x,L)=>I(x||L))};else if(n.key)o.logAction(this.logger,o.LOG_MINOR,"Auth.requestToken()","using token auth with client-side signing"),s=(u,g)=>{_e(this.createTokenRequest(u,n),(f,b)=>g(f,b??null))};else{let u="Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)";throw o.logAction(this.logger,o.LOG_ERROR,"Auth()","library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help"),new w(u,40171,403)}"capability"in i&&(i.capability=xi(i.capability));let l=(u,g)=>{let f=u.keyName,b="/keys/"+f+"/requestToken",C=function(R){return r.baseUri(R)+b},O=U.defaultPostHeaders(this.client.options);n.requestHeaders&&G(O,n.requestHeaders),o.logAction(this.logger,o.LOG_MICRO,"Auth.requestToken().requestToken","Sending POST to "+b+"; Token params: "+JSON.stringify(u)),_e(this.client.http.do(Z.Post,C,O,JSON.stringify(u),null),(R,I)=>R?g(R):g(I.error,I.body,I.unpacked))};return new Promise((u,g)=>{let f=!1,b=this.client.options.timeouts.realtimeRequestTimeout,C=setTimeout(()=>{f=!0;let O="Token request callback timed out after "+b/1e3+" seconds";o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()",O),g(new w(O,40170,401))},b);s(i,(O,R,I)=>{if(f)return;if(clearTimeout(C),O){o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()","token request signing call returned error; err = "+J(O)),g(Mi(O));return}if(typeof R=="string"){R.length===0?g(new w("Token string is empty",40170,401)):R.length>fn?g(new w("Token string exceeded max permitted length (was "+R.length+" bytes)",40170,401)):R==="undefined"||R==="null"?g(new w("Token string was literal null/undefined",40170,401)):R[0]==="{"&&!(I&&I.indexOf("application/jwt")>-1)?g(new w("Token was double-encoded; make sure you're not JSON-encoding an already encoded token request or details",40170,401)):u({token:R});return}if(typeof R!="object"||R===null){let L="Expected token request callback to call back with a token string or token request/details object, but got a "+typeof R;o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()",L),g(new w(L,40170,401));return}let x=JSON.stringify(R).length;if(x>fn&&!n.suppressMaxLengthCheck){g(new w("Token request/details object exceeded max permitted stringified size (was "+x+" bytes)",40170,401));return}if("issued"in R){u(R);return}if(!("keyName"in R)){let L="Expected token request callback to call back with a token string, token request object, or token details object";o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()",L),g(new w(L,40170,401));return}l(R,(L,j,z)=>{if(L){o.logAction(this.logger,o.LOG_ERROR,"Auth.requestToken()","token request API call returned error; err = "+J(L)),g(Mi(L));return}z||(j=JSON.parse(j)),o.logAction(this.logger,o.LOG_MINOR,"Auth.getToken()","token received"),u(j)})})})}async createTokenRequest(e,t){t=t||this.authOptions,e=e||ge(this.tokenParams);let n=t.key;if(!n)throw new w("No key specified",40101,403);let i=n.split(":"),s=i[0],r=i[1];if(!r)throw new w("Invalid key specified",40101,403);if(e.clientId==="")throw new w("clientId can\u2019t be an empty string",40012,400);"capability"in e&&(e.capability=xi(e.capability));let l=G({keyName:s},e),u=e.clientId||"",g=e.ttl||"",f=e.capability||"";l.timestamp||(l.timestamp=await this.getTimestamp(t&&t.queryTime));let b=l.nonce||(l.nonce=Dr()),C=l.timestamp,O=l.keyName+`
2
2
  `+g+`
3
3
  `+f+`
4
4
  `+u+`
5
5
  `+C+`
6
6
  `+b+`
7
- `;return l.mac=l.mac||Fr(O,r),o.logAction(this.logger,o.LOG_MINOR,"Auth.getTokenRequest()","generated signed request"),l}async getAuthParams(){if(this.method=="basic")return{key:this.key};{let e=await this._ensureValidAuthCredentials(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{access_token:e.token}}}async getAuthHeaders(){if(this.method=="basic")return{authorization:"Basic "+this.basicKey};{let e=await this._ensureValidAuthCredentials(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{authorization:"Bearer "+Ut(e.token)}}}async getTimestamp(e){return!this.isTimeOffsetSet()&&(e||this.authOptions.queryTime)?this.client.time():this.getTimestampUsingOffset()}getTimestampUsingOffset(){return Date.now()+(this.client.serverTimeOffset||0)}isTimeOffsetSet(){return this.client.serverTimeOffset!==null}_saveBasicOptions(e){this.method="basic",this.key=e.key,this.basicKey=Ut(e.key),this.authOptions=e||{},"clientId"in e&&this._userSetClientId(e.clientId)}_saveTokenOptions(e,t){this.method="token",e&&(this.tokenParams=e),t&&(t.token&&(t.tokenDetails=typeof t.token=="string"?{token:t.token}:t.token),t.tokenDetails&&(this.tokenDetails=t.tokenDetails),"clientId"in t&&this._userSetClientId(t.clientId),this.authOptions=t)}async _ensureValidAuthCredentials(e){let t=this.tokenDetails;if(t){if(this._tokenClientIdMismatch(t.clientId))throw new w("Mismatch between clientId in token ("+t.clientId+") and current clientId ("+this.clientId+")",40102,403);if(!this.isTimeOffsetSet()||!t.expires||t.expires>=this.getTimestampUsingOffset())return o.logAction(this.logger,o.LOG_MINOR,"Auth.getToken()","using cached token; expires = "+t.expires),t;o.logAction(this.logger,o.LOG_MINOR,"Auth.getToken()","deleting expired token"),this.tokenDetails=null}let n=(this.waitingForTokenRequest||(this.waitingForTokenRequest=dn.create(this.logger))).createPromise();if(this.currentTokenRequestId!==null&&!e)return n;let i=this.currentTokenRequestId=zr(),s,r=null;try{s=await this.requestToken(this.tokenParams,this.authOptions)}catch(u){r=u}if(this.currentTokenRequestId>i)return o.logAction(this.logger,o.LOG_MINOR,"Auth._ensureValidAuthCredentials()","Discarding token request response; overtaken by newer one"),n;this.currentTokenRequestId=null;let l=this.waitingForTokenRequest;return this.waitingForTokenRequest=null,r?(l?.rejectAll(r),n):(l?.resolveAll(this.tokenDetails=s),n)}_userSetClientId(e){if(typeof e=="string"||e===null){if(e==="*")throw new w('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, instantiate the library with {defaultTokenParams: {clientId: "*"}}), or if calling authorize(), pass it in as a tokenParam: authorize({clientId: "*"}, authOptions)',40012,400);{let t=this._uncheckedSetClientId(e);if(t)throw t}}else throw new w("clientId must be either a string or null",40012,400)}_uncheckedSetClientId(e){if(this._tokenClientIdMismatch(e)){let t="Unexpected clientId mismatch: client has "+this.clientId+", requested "+e,n=new w(t,40102,401);return o.logAction(this.logger,o.LOG_ERROR,"Auth._uncheckedSetClientId()",t),n}else return this.clientId=this.tokenParams.clientId=e,null}_tokenClientIdMismatch(e){return!!(this.clientId&&this.clientId!=="*"&&e&&e!=="*"&&this.clientId!==e)}static isTokenErr(e){return e.code&&e.code>=40140&&e.code<40150}revokeTokens(e,t){return this.client.rest.revokeTokens(e,t)}},Ue=Kr;function pn(e){let t=[];if(e)for(let n in e)t.push(n+"="+e[n]);return t.join("&")}function Xe(e,t){return e+(t?"?":"")+pn(t)}function $r(e,t,n,i,s){e.error?o.logActionNoStrip(s,o.LOG_MICRO,"Http."+t+"()","Received Error; "+Xe(n,i)+"; Error: "+J(e.error)):o.logActionNoStrip(s,o.LOG_MICRO,"Http."+t+"()","Received; "+Xe(n,i)+"; Headers: "+pn(e.headers)+"; StatusCode: "+e.statusCode+"; Body"+(m.BufferUtils.isBuffer(e.body)?" (Base64): "+m.BufferUtils.base64Encode(e.body):": "+e.body))}function Jr(e,t,n,i,s){s.shouldLog(o.LOG_MICRO)&&o.logActionNoStrip(s,o.LOG_MICRO,"Http."+e+"()","Sending; "+Xe(t,i)+"; Body"+(m.BufferUtils.isBuffer(n)?" (Base64): "+m.BufferUtils.base64Encode(n):": "+n))}var gn=class{constructor(e){this.client=e,this.platformHttp=new m.Http(e),this.checkConnectivity=this.platformHttp.checkConnectivity?()=>this.platformHttp.checkConnectivity():void 0}get logger(){var e,t;return(t=(e=this.client)==null?void 0:e.logger)!=null?t:o.defaultLogger}get supportsAuthHeaders(){return this.platformHttp.supportsAuthHeaders}get supportsLinkHeaders(){return this.platformHttp.supportsLinkHeaders}_getHosts(e){let t=e.connection,n=t&&t.connectionManager.host;return n?[n].concat(U.getFallbackHosts(e.options)):U.getHosts(e.options)}async do(e,t,n,i,s){try{let r=this.client;if(!r)return{error:new w("http.do called without client",5e4,500)};let l=typeof t=="function"?t:function(C){return r.baseUri(C)+t},u=r._currentFallback;if(u)if(u.validUntil>Date.now()){let C=await this.doUri(e,l(u.host),n,i,s);return C.error&&this.platformHttp.shouldFallback(C.error)?(r._currentFallback=null,this.do(e,t,n,i,s)):C}else r._currentFallback=null;let g=this._getHosts(r);if(g.length===1)return this.doUri(e,l(g[0]),n,i,s);let f=null,b=async(C,O)=>{let R=C.shift();f=f??new Date;let I=await this.doUri(e,l(R),n,i,s);return I.error&&this.platformHttp.shouldFallback(I.error)&&C.length?Date.now()-f.getTime()>r.options.timeouts.httpMaxRetryDuration?{error:new w(`Timeout for trying fallback hosts retries. Total elapsed time exceeded the ${r.options.timeouts.httpMaxRetryDuration}ms limit`,50003,500)}:b(C,!0):(O&&(r._currentFallback={host:R,validUntil:Date.now()+r.options.timeouts.fallbackRetryTimeout}),I)};return b(g)}catch(r){return{error:new w(`Unexpected error in Http.do: ${J(r)}`,500,5e4)}}}async doUri(e,t,n,i,s){try{Jr(e,t,i,s,this.logger);let r=await this.platformHttp.doUri(e,t,n,i,s);return this.logger.shouldLog(o.LOG_MICRO)&&$r(r,e,t,s,this.logger),r}catch(r){return{error:new w(`Unexpected error in Http.doUri: ${J(r)}`,500,5e4)}}}},Pi=class{constructor(e){this.Platform=m,this.ErrorInfo=w,this.Logger=o,this.Defaults=U,this.Utils=re;var t,n,i,s,r,l,u,g;this._additionalHTTPRequestImplementations=(t=e.plugins)!=null?t:null,this.logger=new o,this.logger.setLog(e.logLevel,e.logHandler),o.logAction(this.logger,o.LOG_MICRO,"BaseClient()","initialized with clientOptions "+m.Config.inspect(e)),this._MsgPack=(i=(n=e.plugins)==null?void 0:n.MsgPack)!=null?i:null;let f=this.options=U.normaliseOptions(e,this._MsgPack,this.logger);if(f.key){let b=f.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!b){let C="invalid key parameter";throw o.logAction(this.logger,o.LOG_ERROR,"BaseClient()",C),new w(C,40400,404)}f.keyName=b[1],f.keySecret=b[2]}if("clientId"in f)if(typeof f.clientId=="string"||f.clientId===null){if(f.clientId==="*")throw new w('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400)}else throw new w("clientId must be either a string or null",40012,400);o.logAction(this.logger,o.LOG_MINOR,"BaseClient()","started; version = "+U.version),this._currentFallback=null,this.serverTimeOffset=null,this.http=new gn(this),this.auth=new Ue(this,f),this._rest=(s=e.plugins)!=null&&s.Rest?new e.plugins.Rest(this):null,this._Crypto=(l=(r=e.plugins)==null?void 0:r.Crypto)!=null?l:null,this.__FilteredSubscriptions=(g=(u=e.plugins)==null?void 0:u.MessageInteractions)!=null?g:null}get rest(){return this._rest||we("Rest"),this._rest}get _FilteredSubscriptions(){return this.__FilteredSubscriptions||we("MessageInteractions"),this.__FilteredSubscriptions}get channels(){return this.rest.channels}get push(){return this.rest.push}get device(){var e;return(!((e=this.options.plugins)!=null&&e.Push)||!this.push.LocalDevice)&&we("Push"),this._device||(this._device=this.push.LocalDevice.load(this)),this._device}baseUri(e){return U.getHttpScheme(this.options)+e+":"+U.getPort(this.options,!1)}async stats(e){return this.rest.stats(e)}async time(e){return this.rest.time(e)}async request(e,t,n,i,s,r){return this.rest.request(e,t,n,i,s,r)}batchPublish(e){return this.rest.batchPublish(e)}batchPresence(e){return this.rest.batchPresence(e)}setLog(e){this.logger.setLog(e.level,e.handler)}};Pi.Platform=m;var Li=Pi,Qr=class rt{toJSON(){var t,n,i;return{id:this.id,deviceSecret:this.deviceSecret,platform:this.platform,formFactor:this.formFactor,clientId:this.clientId,metadata:this.metadata,deviceIdentityToken:this.deviceIdentityToken,push:{recipient:(t=this.push)==null?void 0:t.recipient,state:(n=this.push)==null?void 0:n.state,error:(i=this.push)==null?void 0:i.error}}}toString(){var t,n,i,s;let r="[DeviceDetails";return this.id&&(r+="; id="+this.id),this.platform&&(r+="; platform="+this.platform),this.formFactor&&(r+="; formFactor="+this.formFactor),this.clientId&&(r+="; clientId="+this.clientId),this.metadata&&(r+="; metadata="+this.metadata),this.deviceIdentityToken&&(r+="; deviceIdentityToken="+JSON.stringify(this.deviceIdentityToken)),(t=this.push)!=null&&t.recipient&&(r+="; push.recipient="+JSON.stringify(this.push.recipient)),(n=this.push)!=null&&n.state&&(r+="; push.state="+this.push.state),(i=this.push)!=null&&i.error&&(r+="; push.error="+JSON.stringify(this.push.error)),(s=this.push)!=null&&s.metadata&&(r+="; push.metadata="+this.push.metadata),r+="]",r}static toRequestBody(t,n,i){return Te(t,n,i)}static fromResponseBody(t,n,i){return i&&(t=ke(t,n,i)),Array.isArray(t)?rt.fromValuesArray(t):rt.fromValues(t)}static fromValues(t){return t.error=t.error&&w.fromValues(t.error),Object.assign(new rt,t)}static fromLocalDevice(t){return Object.assign(new rt,t)}static fromValuesArray(t){let n=t.length,i=new Array(n);for(let s=0;s<n;s++)i[s]=rt.fromValues(t[s]);return i}},Ye=Qr;async function Ui(e,t,n,i){if(e.http.supportsAuthHeaders){let s=await e.auth.getAuthHeaders();return i(G(s,t),n)}else{let s=await e.auth.getAuthParams();return i(t,G(s,n))}}function Xr(e,t,n){if(e.err&&!e.body)return{err:e.err};if(e.statusCode===qt.NoContent)return E(y({},e),{body:[],unpacked:!0});let i=e.body;if(!e.unpacked)try{i=ke(i,t,n)}catch(u){return lt(u)?{err:u}:{err:new ce(J(u),null)}}if(!i)return{err:new ce("unenvelope(): Response body is missing",null)};let{statusCode:s,response:r,headers:l}=i;if(s===void 0)return E(y({},e),{body:i,unpacked:!0});if(s<200||s>=300){let u=r&&r.error||e.err;return u||(u=new Error("Error in unenveloping "+i),u.statusCode=s),{err:u,body:r,headers:l,unpacked:!0,statusCode:s}}return{err:e.err,body:r,headers:l,unpacked:!0,statusCode:s}}function Yr(e,t,n,i,s){e.err?o.logAction(s,o.LOG_MICRO,"Resource."+t+"()","Received Error; "+Xe(n,i)+"; Error: "+J(e.err)):o.logAction(s,o.LOG_MICRO,"Resource."+t+"()","Received; "+Xe(n,i)+"; Headers: "+pn(e.headers)+"; StatusCode: "+e.statusCode+"; Body: "+(m.BufferUtils.isBuffer(e.body)?" (Base64): "+m.BufferUtils.base64Encode(e.body):": "+m.Config.inspect(e.body)))}var Zr=class ot{static async get(t,n,i,s,r,l){return ot.do(Z.Get,t,n,null,i,s,r,l??!1)}static async delete(t,n,i,s,r,l){return ot.do(Z.Delete,t,n,null,i,s,r,l)}static async post(t,n,i,s,r,l,u){return ot.do(Z.Post,t,n,i,s,r,l,u)}static async patch(t,n,i,s,r,l,u){return ot.do(Z.Patch,t,n,i,s,r,l,u)}static async put(t,n,i,s,r,l,u){return ot.do(Z.Put,t,n,i,s,r,l,u)}static async do(t,n,i,s,r,l,u,g){u&&((l=l||{}).envelope=u);let f=n.logger;async function b(O,R){var I;if(f.shouldLog(o.LOG_MICRO)){let L=s;if(((I=O["content-type"])==null?void 0:I.indexOf("msgpack"))>0)try{n._MsgPack||we("MsgPack"),L=n._MsgPack.decode(s)}catch(j){o.logAction(f,o.LOG_MICRO,"Resource."+t+"()","Sending MsgPack Decoding Error: "+J(j))}o.logAction(f,o.LOG_MICRO,"Resource."+t+"()","Sending; "+Xe(i,R)+"; Body: "+L)}let x=await n.http.do(t,i,O,s,R);return x.error&&Ue.isTokenErr(x.error)?(await n.auth.authorize(null,null),Ui(n,O,R,b)):{err:x.error,body:x.body,headers:x.headers,unpacked:x.unpacked,statusCode:x.statusCode}}let C=await Ui(n,r,l,b);if(u&&(C=Xr(C,n._MsgPack,u)),f.shouldLog(o.LOG_MICRO)&&Yr(C,t,i,l,f),g){if(C.err)throw C.err;{let O=y({},C);return delete O.err,O}}return C}},oe=Zr;function eo(e){let t=e.match(/^\.\/(\w+)\?(.*)$/);return t&&t[2]&&Le(t[2])}function to(e){typeof e=="string"&&(e=e.split(","));let t={};for(let n=0;n<e.length;n++){let i=e[n].match(/^\s*<(.+)>;\s*rel="(\w+)"$/);if(i){let s=eo(i[1]);s&&(t[i[2]]=s)}}return t}function no(e,t,n){return!(n&&(t||typeof e.code=="number"))}var io=class{constructor(e,t,n,i,s,r){this.client=e,this.path=t,this.headers=n,this.envelope=i??null,this.bodyHandler=s,this.useHttpPaginatedResponse=r||!1}get logger(){return this.client.logger}async get(e){let t=await oe.get(this.client,this.path,this.headers,e,this.envelope,!1);return this.handlePage(t)}async delete(e){let t=await oe.delete(this.client,this.path,this.headers,e,this.envelope,!1);return this.handlePage(t)}async post(e,t){let n=await oe.post(this.client,this.path,t,this.headers,e,this.envelope,!1);return this.handlePage(n)}async put(e,t){let n=await oe.put(this.client,this.path,t,this.headers,e,this.envelope,!1);return this.handlePage(n)}async patch(e,t){let n=await oe.patch(this.client,this.path,t,this.headers,e,this.envelope,!1);return this.handlePage(n)}async handlePage(e){if(e.err&&no(e.err,e.body,this.useHttpPaginatedResponse))throw o.logAction(this.logger,o.LOG_ERROR,"PaginatedResource.handlePage()","Unexpected error getting resource: err = "+J(e.err)),e.err;let t,n,i;try{t=e.statusCode==qt.NoContent?[]:await this.bodyHandler(e.body,e.headers||{},e.unpacked)}catch(s){throw e.err||s}return e.headers&&(n=e.headers.Link||e.headers.link)&&(i=to(n)),this.useHttpPaginatedResponse?new so(this,t,e.headers||{},e.statusCode,i,e.err):new Ni(this,t,i)}},Ni=class{constructor(e,t,n){this.resource=e,this.items=t;let i=this;n&&("first"in n&&(this.first=async function(){return i.get(n.first)}),"current"in n&&(this.current=async function(){return i.get(n.current)}),this.next=async function(){return"next"in n?i.get(n.next):null},this.hasNext=function(){return"next"in n},this.isLast=()=>{var s;return!((s=this.hasNext)!=null&&s.call(this))})}async get(e){let t=this.resource,n=await oe.get(t.client,t.path,t.headers,e,t.envelope,!1);return t.handlePage(n)}},so=class extends Ni{constructor(e,t,n,i,s,r){super(e,t,s),this.statusCode=i,this.success=i<300&&i>=200,this.headers=n,this.errorCode=r&&r.code,this.errorMessage=r&&r.message}toJSON(){return{items:this.items,statusCode:this.statusCode,success:this.success,headers:this.headers,errorCode:this.errorCode,errorMessage:this.errorMessage}}},qe=io,Bi=class Ct{toJSON(){return{channel:this.channel,deviceId:this.deviceId,clientId:this.clientId}}toString(){let t="[PushChannelSubscription";return this.channel&&(t+="; channel="+this.channel),this.deviceId&&(t+="; deviceId="+this.deviceId),this.clientId&&(t+="; clientId="+this.clientId),t+="]",t}static fromResponseBody(t,n,i){return i&&(t=ke(t,n,i)),Array.isArray(t)?Ct.fromValuesArray(t):Ct.fromValues(t)}static fromValues(t){return Object.assign(new Ct,t)}static fromValuesArray(t){let n=t.length,i=new Array(n);for(let s=0;s<n;s++)i[s]=Ct.fromValues(t[s]);return i}};Bi.toRequestBody=Te;var ro=Bi,mn=ro,oo=class{constructor(e){var t;this.client=e,this.admin=new ao(e),m.Config.push&&((t=e.options.plugins)!=null&&t.Push)&&(this.stateMachine=new e.options.plugins.Push.ActivationStateMachine(e),this.LocalDevice=e.options.plugins.Push.localDeviceFactory(Ye))}async activate(e,t){await new Promise((n,i)=>{var s;if(!((s=this.client.options.plugins)!=null&&s.Push)){i(Nt("Push"));return}if(!this.stateMachine){i(new w("This platform is not supported as a target of push notifications",4e4,400));return}if(this.stateMachine.activatedCallback){i(new w("Activation already in progress",4e4,400));return}this.stateMachine.activatedCallback=r=>{if(r){i(r);return}n()},this.stateMachine.updateFailedCallback=t,this.stateMachine.handleEvent(new this.client.options.plugins.Push.CalledActivate(this.stateMachine,e))})}async deactivate(e){await new Promise((t,n)=>{var i;if(!((i=this.client.options.plugins)!=null&&i.Push)){n(Nt("Push"));return}if(!this.stateMachine){n(new w("This platform is not supported as a target of push notifications",4e4,400));return}if(this.stateMachine.deactivatedCallback){n(new w("Deactivation already in progress",4e4,400));return}this.stateMachine.deactivatedCallback=s=>{if(s){n(s);return}t()},this.stateMachine.handleEvent(new this.client.options.plugins.Push.CalledDeactivate(this.stateMachine,e))})}},ao=class{constructor(e){this.client=e,this.deviceRegistrations=new co(e),this.channelSubscriptions=new lo(e)}async publish(e,t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=U.defaultPostHeaders(n.options,{format:i}),r={},l=G({recipient:e},t);G(s,n.options.headers),n.options.pushFullWait&&G(r,{fullWait:"true"});let u=Te(l,n._MsgPack,i);await oe.post(n,"/push/publish",u,s,r,null,!0)}},co=class{constructor(e){this.client=e}async save(e){let t=this.client,n=Ye.fromValues(e),i=t.options.useBinaryProtocol?"msgpack":"json",s=U.defaultPostHeaders(t.options,{format:i}),r={};G(s,t.options.headers),t.options.pushFullWait&&G(r,{fullWait:"true"});let l=Te(n,t._MsgPack,i),u=await oe.put(t,"/push/deviceRegistrations/"+encodeURIComponent(e.id),l,s,r,null,!0);return Ye.fromResponseBody(u.body,t._MsgPack,u.unpacked?void 0:i)}async get(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=U.defaultGetHeaders(t.options,{format:n}),s=e.id||e;if(typeof s!="string"||!s.length)throw new w("First argument to DeviceRegistrations#get must be a deviceId string or DeviceDetails",4e4,400);G(i,t.options.headers);let r=await oe.get(t,"/push/deviceRegistrations/"+encodeURIComponent(s),i,{},null,!0);return Ye.fromResponseBody(r.body,t._MsgPack,r.unpacked?void 0:n)}async list(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=this.client.http.supportsLinkHeaders?void 0:n,s=U.defaultGetHeaders(t.options,{format:n});return G(s,t.options.headers),new qe(t,"/push/deviceRegistrations",s,i,async function(r,l,u){return Ye.fromResponseBody(r,t._MsgPack,u?void 0:n)}).get(e)}async remove(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=U.defaultGetHeaders(t.options,{format:n}),s={},r=e.id||e;if(typeof r!="string"||!r.length)throw new w("First argument to DeviceRegistrations#remove must be a deviceId string or DeviceDetails",4e4,400);G(i,t.options.headers),t.options.pushFullWait&&G(s,{fullWait:"true"}),await oe.delete(t,"/push/deviceRegistrations/"+encodeURIComponent(r),i,s,null,!0)}async removeWhere(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=U.defaultGetHeaders(t.options,{format:n});G(i,t.options.headers),t.options.pushFullWait&&G(e,{fullWait:"true"}),await oe.delete(t,"/push/deviceRegistrations",i,e,null,!0)}},lo=class Ms{constructor(t){this.remove=Ms.prototype.removeWhere,this.client=t}async save(t){let n=this.client,i=mn.fromValues(t),s=n.options.useBinaryProtocol?"msgpack":"json",r=U.defaultPostHeaders(n.options,{format:s}),l={};G(r,n.options.headers),n.options.pushFullWait&&G(l,{fullWait:"true"});let u=Te(i,n._MsgPack,s),g=await oe.post(n,"/push/channelSubscriptions",u,r,l,null,!0);return mn.fromResponseBody(g.body,n._MsgPack,g.unpacked?void 0:s)}async list(t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=this.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),new qe(n,"/push/channelSubscriptions",r,s,async function(l,u,g){return mn.fromResponseBody(l,n._MsgPack,g?void 0:i)}).get(t)}async removeWhere(t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=U.defaultGetHeaders(n.options,{format:i});G(s,n.options.headers),n.options.pushFullWait&&G(t,{fullWait:"true"}),await oe.delete(n,"/push/channelSubscriptions",s,t,null,!0)}async listChannels(t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=this.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),n.options.pushFullWait&&G(t,{fullWait:"true"}),new qe(n,"/push/channels",r,s,async function(l,u,g){let f=!g&&i?ke(l,n._MsgPack,i):l;for(let b=0;b<f.length;b++)f[b]=String(f[b]);return f}).get(t)}},ho=oo,Gi=["message.unset","message.create","message.update","message.delete","annotation.create","annotation.delete","meta.occupancy"],uo=new Map(Gi.map((e,t)=>[e,t])),fo=new Map(Gi.map((e,t)=>[t,e]));function po(e){return fo.get(e)}function go(e){return e?uo.get(e):void 0}function mo(e){return!e||!e.channelOptions?{channelOptions:e,plugins:{},baseEncodedPreviousPayload:void 0}:e}function qi(e,t,n){if(n&&n.cipher){e||we("Crypto");let i=e.getCipher(n.cipher,t);return{cipher:i.cipherParams,channelCipher:i.cipher}}return n??{}}function yo(e){let t=0;return e.name&&(t+=e.name.length),e.clientId&&(t+=e.clientId.length),e.extras&&(t+=JSON.stringify(e.extras).length),e.data&&(t+=ui(e.data)),t}async function Di(e,t,n,i){let s=Dt(n),r=qi(t,e,i??null);try{await ht(s,r)}catch(l){o.logAction(e,o.LOG_ERROR,"Message.fromEncoded()",l.toString())}return s}async function vo(e,t,n,i){return Promise.all(n.map(function(s){return Di(e,t,s,i)}))}async function _o(e,t){let n=Dt(e);try{await ht(n,t.channelOptions)}catch(i){o.logAction(t.logger,o.LOG_ERROR,"Message._fromEncoded()",i.toString())}return n}async function bo(e,t){return Promise.all(e.map(function(n){return _o(n,t)}))}async function wo(e,t){let n=e.data,i=e.encoding,s=t.channelCipher;i=i?i+"/":"",m.BufferUtils.isBuffer(n)||(n=m.BufferUtils.utf8Encode(String(n)),i=i+"utf-8/");let r=await s.encrypt(n);return e.data=r,e.encoding=i+"cipher+"+s.algorithm,e}async function yn(e,t){let n=e.data;if(!(typeof n=="string"||m.BufferUtils.isBuffer(n)||n===null||n===void 0))if(de(n)||Array.isArray(n))e.data=JSON.stringify(n),e.encoding=e.encoding?e.encoding+"/json":"json";else throw new w("Data type is unsupported",40013,400);return t!=null&&t.cipher?wo(e,t):e}async function Hi(e,t){return Promise.all(e.map(n=>yn(n,t)))}var Co=Te;async function ht(e,t){let n=mo(t),i=e.data,s=e.encoding;if(s){let r=s.split("/"),l,u=r.length,g=e.data,f="";try{for(;(l=u)>0;){let b=r[--u].match(/([-\w]+)(\+([\w-]+))?/);if(!b)break;switch(f=b[1],f){case"base64":g=m.BufferUtils.base64Decode(String(g)),l==r.length&&(i=g);continue;case"utf-8":g=m.BufferUtils.utf8Decode(g);continue;case"json":g=JSON.parse(g);continue;case"cipher":if(n.channelOptions!=null&&n.channelOptions.cipher&&n.channelOptions.channelCipher){let C=b[3],O=n.channelOptions.channelCipher;if(C!=O.algorithm)throw new Error("Unable to decrypt message with given cipher; incompatible cipher params");g=await O.decrypt(g);continue}else throw new Error("Unable to decrypt message; not an encrypted channel");case"vcdiff":if(!n.plugins||!n.plugins.vcdiff)throw new w("Missing Vcdiff decoder (https://github.com/ably-forks/vcdiff-decoder)",40019,400);if(typeof Uint8Array>"u")throw new w("Delta decoding not supported on this browser (need ArrayBuffer & Uint8Array)",40020,400);try{let C=n.baseEncodedPreviousPayload;typeof C=="string"&&(C=m.BufferUtils.utf8Encode(C));let O=m.BufferUtils.toBuffer(C);g=m.BufferUtils.toBuffer(g),g=m.BufferUtils.arrayBufferViewToBuffer(n.plugins.vcdiff.decode(g,O)),i=g}catch(C){throw new w("Vcdiff delta decode failed with "+C,40018,400)}continue;default:throw new Error("Unknown encoding")}}}catch(b){let C=b;throw new w("Error processing the "+f+" encoding, decoder returned \u2018"+C.message+"\u2019",C.code||40013,400)}finally{e.encoding=l<=0?null:r.slice(0,l).join("/"),e.data=g}}n.baseEncodedPreviousPayload=i}function Ze(e){return Object.assign(new bn,e)}function Dt(e){let t=po(e.action)||e.action,n=Object.assign(new bn,E(y({},e),{action:t}));return n.expandFields(),n}function vn(e){return e.map(Ze)}function _n(e){let t,n=0;for(let i=0;i<e.length;i++)t=e[i],n+=t.size||(t.size=yo(t));return n}var bn=class{toJSON(){let e=this.encoding,t=this.data;return t&&m.BufferUtils.isBuffer(t)&&(arguments.length>0?(e=e?e+"/base64":"base64",t=m.BufferUtils.base64Encode(t)):t=m.BufferUtils.toBuffer(t)),{name:this.name,id:this.id,clientId:this.clientId,connectionId:this.connectionId,connectionKey:this.connectionKey,extras:this.extras,serial:this.serial,action:go(this.action)||this.action,refSerial:this.refSerial,refType:this.refType,createdAt:this.createdAt,version:this.version,operation:this.operation,encoding:e,data:t}}expandFields(){this.action==="message.create"&&(this.version&&!this.serial&&(this.serial=this.version),this.timestamp&&!this.createdAt&&(this.createdAt=this.timestamp))}toString(){let e="[Message";return this.name&&(e+="; name="+this.name),this.id&&(e+="; id="+this.id),this.timestamp&&(e+="; timestamp="+this.timestamp),this.clientId&&(e+="; clientId="+this.clientId),this.connectionId&&(e+="; connectionId="+this.connectionId),this.encoding&&(e+="; encoding="+this.encoding),this.extras&&(e+="; extras ="+JSON.stringify(this.extras)),this.data&&(typeof this.data=="string"?e+="; data="+this.data:m.BufferUtils.isBuffer(this.data)?e+="; data (buffer)="+m.BufferUtils.base64Encode(this.data):e+="; data (json)="+JSON.stringify(this.data)),this.extras&&(e+="; extras="+JSON.stringify(this.extras)),this.action&&(e+="; action="+this.action),this.serial&&(e+="; serial="+this.serial),this.version&&(e+="; version="+this.version),this.refSerial&&(e+="; refSerial="+this.refSerial),this.refType&&(e+="; refType="+this.refType),this.createdAt&&(e+="; createdAt="+this.createdAt),this.operation&&(e+="; operation="+JSON.stringify(this.operation)),e+="]",e}},Ro=bn,Fi=["absent","present","enter","leave","update"];function ko(e){return Fi.indexOf(e)}async function ji(e,t,n,i){let s=Ht(n),r=qi(t,e,i??null);try{await wn(s,r??{})}catch(l){o.logAction(e,o.LOG_ERROR,"PresenceMessage.fromEncoded()",l.toString())}return s}async function Ao(e,t,n,i){return Promise.all(n.map(function(s){return ji(e,t,s,i)}))}async function Oo(e,t){let n=Ht(e);try{await wn(n,t.channelOptions)}catch(i){o.logAction(t.logger,o.LOG_ERROR,"PresenceMessage._fromEncoded()",i.toString())}return n}async function Vi(e,t){return Promise.all(e.map(function(n){return Oo(n,t)}))}function Ne(e){return Object.assign(new Ft,e)}function Ht(e){let t=Fi[e.action];return Object.assign(new Ft,E(y({},e),{action:t}))}var wn=ht;function Wi(e){return e.map(Ne)}function zi(e){return e instanceof Ft?e:Ne({data:e})}var Ft=class{isSynthesized(){return!this.id||!this.connectionId?!0:this.id.substring(this.connectionId.length,0)!==this.connectionId}parseId(){if(!this.id)throw new Error("parseId(): Presence message does not contain an id");let e=this.id.split(":");return{connectionId:e[0],msgSerial:parseInt(e[1],10),index:parseInt(e[2],10)}}toJSON(){let e=this.data,t=this.encoding;return e&&m.BufferUtils.isBuffer(e)&&(arguments.length>0?(t=t?t+"/base64":"base64",e=m.BufferUtils.base64Encode(e)):e=m.BufferUtils.toBuffer(e)),{id:this.id,clientId:this.clientId,action:ko(this.action),data:e,encoding:t,extras:this.extras}}toString(){let e="[PresenceMessage";return e+="; action="+this.action,this.id&&(e+="; id="+this.id),this.timestamp&&(e+="; timestamp="+this.timestamp),this.clientId&&(e+="; clientId="+this.clientId),this.connectionId&&(e+="; connectionId="+this.connectionId),this.encoding&&(e+="; encoding="+this.encoding),this.data&&(typeof this.data=="string"?e+="; data="+this.data:m.BufferUtils.isBuffer(this.data)?e+="; data (buffer)="+m.BufferUtils.base64Encode(this.data):e+="; data (json)="+JSON.stringify(this.data)),this.extras&&(e+="; extras="+JSON.stringify(this.extras)),e+="]",e}},So=Ft,To=class{constructor(e){this.channel=e}get logger(){return this.channel.logger}async get(e){o.logAction(this.logger,o.LOG_MICRO,"RestPresence.get()","channel = "+this.channel.name);let t=this.channel.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=this.channel.client.http.supportsLinkHeaders?void 0:n,s=U.defaultGetHeaders(t.options,{format:n});return G(s,t.options.headers),new qe(t,this.channel.client.rest.presenceMixin.basePath(this),s,i,async(r,l,u)=>{let g=u?r:ke(r,t._MsgPack,n);return Vi(g,this.channel)}).get(e)}async history(e){return o.logAction(this.logger,o.LOG_MICRO,"RestPresence.history()","channel = "+this.channel.name),this.channel.client.rest.presenceMixin.history(this,e)}},Mo=To,xo=9;function Io(e){return e.every(function(t){return!t.id})}var Eo=class{constructor(e,t,n){var i,s;o.logAction(e.logger,o.LOG_MINOR,"RestChannel()","started; name = "+t),this.name=t,this.client=e,this.presence=new Mo(this),this.channelOptions=Bt((i=e._Crypto)!=null?i:null,this.logger,n),(s=e.options.plugins)!=null&&s.Push&&(this._push=new e.options.plugins.Push.PushChannel(this))}get push(){return this._push||we("Push"),this._push}get logger(){return this.client.logger}setOptions(e){var t;this.channelOptions=Bt((t=this.client._Crypto)!=null?t:null,this.logger,e)}async history(e){return o.logAction(this.logger,o.LOG_MICRO,"RestChannel.history()","channel = "+this.name),this.client.rest.channelMixin.history(this,e)}async publish(...e){let t=e[0],n=e[1],i,s;if(typeof t=="string"||t===null)i=[Ze({name:t,data:n})],s=e[2];else if(de(t))i=[Ze(t)],s=e[1];else if(Array.isArray(t))i=vn(t),s=e[1];else throw new w("The single-argument form of publish() expects a message object or an array of message objects",40013,400);s||(s={});let r=this.client,l=r.options,u=l.useBinaryProtocol?"msgpack":"json",g=r.options.idempotentRestPublishing,f=U.defaultPostHeaders(r.options,{format:u});if(G(f,l.headers),g&&Io(i)){let O=await di(xo);i.forEach(function(R,I){R.id=O+":"+I.toString()})}await Hi(i,this.channelOptions);let b=_n(i),C=l.maxMessageSize;if(b>C)throw new w("Maximum size of messages that can be published at once exceeded ( was "+b+" bytes; limit is "+C+" bytes)",40009,400);await this._publish(Co(i,r._MsgPack,u),f,s)}async _publish(e,t,n){await oe.post(this.client,this.client.rest.channelMixin.basePath(this)+"/messages",e,t,n,null,!0)}async status(){return this.client.rest.channelMixin.status(this)}},Po=Eo,Lo=class xs{constructor(t){this.entries=t&&t.entries||void 0,this.schema=t&&t.schema||void 0,this.appId=t&&t.appId||void 0,this.inProgress=t&&t.inProgress||void 0,this.unit=t&&t.unit||void 0,this.intervalId=t&&t.intervalId||void 0}static fromValues(t){return new xs(t)}},Uo=Lo,Ki=class{static basePath(e){return"/channels/"+encodeURIComponent(e.name)}static history(e,t){let n=e.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=e.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),new qe(n,this.basePath(e)+"/messages",r,s,async function(l,u,g){let f=g?l:ke(l,n._MsgPack,i);return bo(f,e)}).get(t)}static async status(e){let t=e.client.options.useBinaryProtocol?"msgpack":"json",n=U.defaultPostHeaders(e.client.options,{format:t});return(await oe.get(e.client,this.basePath(e),n,{},t,!0)).body}},No=class{static basePath(e){return Ki.basePath(e.channel)+"/presence"}static async history(e,t){let n=e.channel.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=e.channel.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),new qe(n,this.basePath(e)+"/history",r,s,async(l,u,g)=>{let f=g?l:ke(l,n._MsgPack,i);return Vi(f,e.channel)}).get(t)}},$i=class{constructor(e){this.channelMixin=Ki,this.presenceMixin=No,this.Resource=oe,this.DeviceDetails=Ye,this.client=e,this.channels=new Bo(this.client),this.push=new ho(this.client)}async stats(e){let t=U.defaultGetHeaders(this.client.options),n=this.client.options.useBinaryProtocol?"msgpack":"json",i=this.client.http.supportsLinkHeaders?void 0:n;return G(t,this.client.options.headers),new qe(this.client,"/stats",t,i,function(s,r,l){let u=l?s:JSON.parse(s);for(let g=0;g<u.length;g++)u[g]=Uo.fromValues(u[g]);return u}).get(e)}async time(e){let t=U.defaultGetHeaders(this.client.options);this.client.options.headers&&G(t,this.client.options.headers);let n=u=>this.client.baseUri(u)+"/time",{error:i,body:s,unpacked:r}=await this.client.http.do(Z.Get,n,t,null,e);if(i)throw i;r||(s=JSON.parse(s));let l=s[0];if(!l)throw new w("Internal error (unexpected result type from GET /time)",5e4,500);return this.client.serverTimeOffset=l-Date.now(),l}async request(e,t,n,i,s,r){var l;let[u,g,f]=this.client.options.useBinaryProtocol?(this.client._MsgPack||we("MsgPack"),[this.client._MsgPack.encode,this.client._MsgPack.decode,"msgpack"]):[JSON.stringify,JSON.parse,"json"],b=this.client.http.supportsLinkHeaders?void 0:f;i=i||{};let C=e.toLowerCase(),O=C=="get"?U.defaultGetHeaders(this.client.options,{format:f,protocolVersion:n}):U.defaultPostHeaders(this.client.options,{format:f,protocolVersion:n});typeof s!="string"&&(s=(l=u(s))!=null?l:null),G(O,this.client.options.headers),r&&G(O,r);let R=new qe(this.client,t,O,b,async function(I,x,L){return Qe(L?I:g(I))},!0);if(!m.Http.methods.includes(C))throw new w("Unsupported method "+C,40500,405);return m.Http.methodsWithBody.includes(C)?R[C](i,s):R[C](i)}async batchPublish(e){let t,n;Array.isArray(e)?(t=e,n=!1):(t=[e],n=!0);let i=this.client.options.useBinaryProtocol?"msgpack":"json",s=U.defaultPostHeaders(this.client.options,{format:i});this.client.options.headers&&G(s,this.client.options.headers);let r=Te(t,this.client._MsgPack,i),l=await oe.post(this.client,"/messages",r,s,{},null,!0),u=l.unpacked?l.body:ke(l.body,this.client._MsgPack,i);return n?u[0]:u}async batchPresence(e){let t=this.client.options.useBinaryProtocol?"msgpack":"json",n=U.defaultPostHeaders(this.client.options,{format:t});this.client.options.headers&&G(n,this.client.options.headers);let i=e.join(","),s=await oe.get(this.client,"/presence",n,{channels:i},null,!0);return s.unpacked?s.body:ke(s.body,this.client._MsgPack,t)}async revokeTokens(e,t){if(Ei(this.client.options))throw new w("Cannot revoke tokens when using token auth",40162,401);let n=this.client.options.keyName,i=t??{},s=y({targets:e.map(f=>`${f.type}:${f.value}`)},i),r=this.client.options.useBinaryProtocol?"msgpack":"json",l=U.defaultPostHeaders(this.client.options,{format:r});this.client.options.headers&&G(l,this.client.options.headers);let u=Te(s,this.client._MsgPack,r),g=await oe.post(this.client,`/keys/${n}/revokeTokens`,u,l,{},null,!0);return g.unpacked?g.body:ke(g.body,this.client._MsgPack,r)}},Bo=class{constructor(e){this.client=e,this.all=Object.create(null)}get(e,t){e=String(e);let n=this.all[e];return n?t&&n.setOptions(t):this.all[e]=n=new Po(this.client,e,t),n}release(e){delete this.all[String(e)]}},Go=class extends Li{constructor(e){super(U.objectifyOptions(e,!1,"BaseRest",o.defaultLogger,{Rest:$i}))}},Ji={Rest:$i},Qi=class extends Ro{static async fromEncoded(e,t){return Di(o.defaultLogger,m.Crypto,e,t)}static async fromEncodedArray(e,t){return vo(o.defaultLogger,m.Crypto,e,t)}static fromValues(e){return Ze(e)}static fromWireProtocol(e){return Dt(e)}static async encode(e,t){return yn(e,t)}static async decode(e,t){return ht(e,t)}},Xi=class extends So{static async fromEncoded(e,t){return ji(o.defaultLogger,m.Crypto,e,t)}static async fromEncodedArray(e,t){return Ao(o.defaultLogger,m.Crypto,e,t)}static fromValues(e){return Ne(e)}},et=class Kt extends Go{constructor(t){var n,i;if(!Kt._MsgPack)throw new Error("Expected DefaultRest._MsgPack to have been set");super(U.objectifyOptions(t,!0,"Rest",o.defaultLogger,E(y({},Ji),{Crypto:(n=Kt.Crypto)!=null?n:void 0,MsgPack:(i=Kt._MsgPack)!=null?i:void 0})))}static get Crypto(){if(this._Crypto===null)throw new Error("Encryption not enabled; use ably.encryption.js instead");return this._Crypto}static set Crypto(t){this._Crypto=t}};et._Crypto=null,et.Message=Qi,et.PresenceMessage=Xi,et._MsgPack=null,et._Http=gn;var Cn=et;function qo(e,t,n,i){try{n.apply(t,i)}catch(s){o.logAction(e,o.LOG_ERROR,"EventEmitter.emit()","Unexpected listener exception: "+s+"; stack = "+(s&&s.stack))}}function Rn(e,t,n){let i,s,r;for(let l=0;l<e.length;l++)if(i=e[l],n&&(i=i[n]),Array.isArray(i)){for(;(s=i.indexOf(t))!==-1;)i.splice(s,1);n&&i.length===0&&delete e[l][n]}else if(de(i))for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&Array.isArray(i[r])&&Rn([i],t,r)}var Do=class{constructor(e){this.logger=e,this.any=[],this.events=Object.create(null),this.anyOnce=[],this.eventsOnce=Object.create(null)}on(...e){if(e.length===1){let t=e[0];if(typeof t=="function")this.any.push(t);else throw new Error("EventListener.on(): Invalid arguments: "+m.Config.inspect(e))}if(e.length===2){let[t,n]=e;if(typeof n!="function")throw new Error("EventListener.on(): Invalid arguments: "+m.Config.inspect(e));if(ye(t))this.any.push(n);else if(Array.isArray(t))t.forEach(i=>{this.on(i,n)});else{if(typeof t!="string")throw new Error("EventListener.on(): Invalid arguments: "+m.Config.inspect(e));(this.events[t]||(this.events[t]=[])).push(n)}}}off(...e){if(e.length==0||ye(e[0])&&ye(e[1])){this.any=[],this.events=Object.create(null),this.anyOnce=[],this.eventsOnce=Object.create(null);return}let[t,n]=e,i=null,s=null;if(e.length===1||!n)typeof t=="function"?i=t:s=t;else{if(typeof n!="function")throw new Error("EventEmitter.off(): invalid arguments:"+m.Config.inspect(e));[s,i]=[t,n]}if(i&&ye(s)){Rn([this.any,this.events,this.anyOnce,this.eventsOnce],i);return}if(Array.isArray(s)){s.forEach(r=>{this.off(r,i)});return}if(typeof s!="string")throw new Error("EventEmitter.off(): invalid arguments:"+m.Config.inspect(e));i?Rn([this.events,this.eventsOnce],i,s):(delete this.events[s],delete this.eventsOnce[s])}listeners(e){if(e){let t=this.events[e]||[];return this.eventsOnce[e]&&Array.prototype.push.apply(t,this.eventsOnce[e]),t.length?t:null}return this.any.length?this.any:null}emit(e,...t){let n={event:e},i=[];this.anyOnce.length&&(Array.prototype.push.apply(i,this.anyOnce),this.anyOnce=[]),this.any.length&&Array.prototype.push.apply(i,this.any);let s=this.eventsOnce[e];s&&(Array.prototype.push.apply(i,s),delete this.eventsOnce[e]);let r=this.events[e];r&&Array.prototype.push.apply(i,r),i.forEach(l=>{qo(this.logger,n,l,t)})}once(...e){let t=e.length;if(t===0||t===1&&typeof e[0]!="function"){let s=e[0];return new Promise(r=>{this.once(s,r)})}let[n,i]=e;if(e.length===1&&typeof n=="function")this.anyOnce.push(n);else if(ye(n)){if(typeof i!="function")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));this.anyOnce.push(i)}else if(Array.isArray(n)){let s=this,r=function(){let l=Array.prototype.slice.call(arguments);if(n.forEach(function(u){s.off(u,r)}),typeof i!="function")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));i.apply(this,l)};n.forEach(function(l){s.on(l,r)})}else{if(typeof n!="string")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));let s=this.eventsOnce[n]||(this.eventsOnce[n]=[]);if(i){if(typeof i!="function")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));s.push(i)}}}async whenState(e,t){if(typeof e!="string"||typeof t!="string")throw new Error("whenState requires a valid state String argument");return e===t?null:this.once(e)}},pe=Do,q={HEARTBEAT:0,ACK:1,NACK:2,CONNECT:3,CONNECTED:4,DISCONNECT:5,DISCONNECTED:6,CLOSE:7,CLOSED:8,ERROR:9,ATTACH:10,ATTACHED:11,DETACH:12,DETACHED:13,PRESENCE:14,MESSAGE:15,SYNC:16,AUTH:17,ACTIVATE:18},Yi=[];Object.keys(q).forEach(function(e){Yi[q[e]]=e});var Be={HAS_PRESENCE:1,HAS_BACKLOG:2,RESUMED:4,TRANSIENT:16,ATTACH_RESUME:32,PRESENCE:65536,PUBLISH:1<<17,SUBSCRIBE:1<<18,PRESENCE_SUBSCRIBE:1<<19},Ho=Object.keys(Be);Be.MODE_ALL=Be.PRESENCE|Be.PUBLISH|Be.SUBSCRIBE|Be.PRESENCE_SUBSCRIBE;function Zi(e){let t=[];if(e)for(let n=0;n<e.length;n++)t.push(e[n].toString());return"[ "+t.join(", ")+" ]"}var es=["PRESENCE","PUBLISH","SUBSCRIBE","PRESENCE_SUBSCRIBE"],Fo=Te;function jo(e,t,n,i){let s=ke(e,t,i);return kn(s,n)}function kn(e,t){let n=e.error;n&&(e.error=w.fromValues(n));let i;e.messages&&(i=e.messages.map(l=>Dt(l)));let s;return t&&e.presence&&(s=e.presence.map(l=>t.presenceMessageFromWireProtocol(l))),Object.assign(new On,E(y({},e),{presence:s,messages:i}))}function Vo(e){return kn(e,{presenceMessageFromValues:Ne,presenceMessagesFromValuesArray:Wi,presenceMessageFromWireProtocol:Ht})}function Me(e){return Object.assign(new On,e)}function An(e,t){let n="[ProtocolMessage";e.action!==void 0&&(n+="; action="+Yi[e.action]||e.action);let i=["id","channel","channelSerial","connectionId","count","msgSerial","timestamp"],s;for(let r=0;r<i.length;r++)s=i[r],e[s]!==void 0&&(n+="; "+s+"="+e[s]);if(e.messages&&(n+="; messages="+Zi(vn(e.messages))),e.presence&&t&&(n+="; presence="+Zi(t.presenceMessagesFromValuesArray(e.presence))),e.error&&(n+="; error="+w.fromValues(e.error).toString()),e.auth&&e.auth.accessToken&&(n+="; token="+e.auth.accessToken),e.flags&&(n+="; flags="+Ho.filter(e.hasFlag).join(",")),e.params){let r="";N(e.params,function(l){r.length>0&&(r+="; "),r+=l+"="+e.params[l]}),r.length>0&&(n+="; params=["+r+"]")}return n+="]",n}var On=class{constructor(){this.hasFlag=e=>(this.flags&Be[e])>0}setFlag(e){return this.flags=this.flags|Be[e]}getMode(){return this.flags&&this.flags&Be.MODE_ALL}encodeModesToFlags(e){e.forEach(t=>this.setFlag(t))}decodeModesFromFlags(){let e=[];return es.forEach(t=>{this.hasFlag(t)&&e.push(t)}),e.length>0?e:void 0}},ts=On,Wo=class extends pe{constructor(e){super(e),this.messages=[]}count(){return this.messages.length}push(e){this.messages.push(e)}shift(){return this.messages.shift()}last(){return this.messages[this.messages.length-1]}copyAll(){return this.messages.slice()}append(e){this.messages.push.apply(this.messages,e)}prepend(e){this.messages.unshift.apply(this.messages,e)}completeMessages(e,t,n){o.logAction(this.logger,o.LOG_MICRO,"MessageQueue.completeMessages()","serial = "+e+"; count = "+t),n=n||null;let i=this.messages;if(i.length===0)throw new Error("MessageQueue.completeMessages(): completeMessages called on any empty MessageQueue");let s=i[0];if(s){let r=s.message.msgSerial,l=e+t;if(l>r){let u=i.splice(0,l-r);for(let g of u)g.callback(n)}i.length==0&&this.emit("idle")}}completeAllMessages(e){this.completeMessages(0,Number.MAX_SAFE_INTEGER||Number.MAX_VALUE,e)}resetSendAttempted(){for(let e of this.messages)e.sendAttempted=!1}clear(){o.logAction(this.logger,o.LOG_MICRO,"MessageQueue.clear()","clearing "+this.messages.length+" messages"),this.messages=[],this.emit("idle")}},ns=Wo,is=class{constructor(e,t){this.message=e,this.callback=t,this.merged=!1;let n=e.action;this.sendAttempted=!1,this.ackRequired=n==q.MESSAGE||n==q.PRESENCE}},zo=class extends pe{constructor(e){super(e.logger),this.transport=e,this.messageQueue=new ns(this.logger),e.on("ack",(t,n)=>{this.onAck(t,n)}),e.on("nack",(t,n,i)=>{this.onNack(t,n,i)})}onAck(e,t){o.logAction(this.logger,o.LOG_MICRO,"Protocol.onAck()","serial = "+e+"; count = "+t),this.messageQueue.completeMessages(e,t)}onNack(e,t,n){o.logAction(this.logger,o.LOG_ERROR,"Protocol.onNack()","serial = "+e+"; count = "+t+"; err = "+J(n)),n||(n=new w("Unable to send message; channel not responding",50001,500)),this.messageQueue.completeMessages(e,t,n)}onceIdle(e){let t=this.messageQueue;if(t.count()===0){e();return}t.once("idle",e)}send(e){e.ackRequired&&this.messageQueue.push(e),this.logger.shouldLog(o.LOG_MICRO)&&o.logActionNoStrip(this.logger,o.LOG_MICRO,"Protocol.send()","sending msg; "+An(e.message,this.transport.connectionManager.realtime._RealtimePresence)),e.sendAttempted=!0,this.transport.send(e.message)}getTransport(){return this.transport}getPendingMessages(){return this.messageQueue.copyAll()}clearPendingMessages(){return this.messageQueue.clear()}finish(){let e=this.transport;this.onceIdle(function(){e.disconnect()})}},Ko=zo,$o=class{constructor(e,t,n,i){this.previous=e,this.current=t,n&&(this.retryIn=n),i&&(this.reason=i)}},jt=$o,De={DISCONNECTED:80003,SUSPENDED:80002,FAILED:8e4,CLOSING:80017,CLOSED:80017,UNKNOWN_CONNECTION_ERR:50002,UNKNOWN_CHANNEL_ERR:50001},Jo={disconnected:()=>w.fromValues({statusCode:400,code:De.DISCONNECTED,message:"Connection to server temporarily unavailable"}),suspended:()=>w.fromValues({statusCode:400,code:De.SUSPENDED,message:"Connection to server unavailable"}),failed:()=>w.fromValues({statusCode:400,code:De.FAILED,message:"Connection failed or disconnected by server"}),closing:()=>w.fromValues({statusCode:400,code:De.CLOSING,message:"Connection closing"}),closed:()=>w.fromValues({statusCode:400,code:De.CLOSED,message:"Connection closed"}),unknownConnectionErr:()=>w.fromValues({statusCode:500,code:De.UNKNOWN_CONNECTION_ERR,message:"Internal connection error"}),unknownChannelErr:()=>w.fromValues({statusCode:500,code:De.UNKNOWN_CONNECTION_ERR,message:"Internal channel error"})};function Qo(e){return!e.statusCode||!e.code||e.statusCode>=500?!0:Object.values(De).includes(e.code)}var He=Jo,Xo=Me({action:q.CLOSE}),Yo=Me({action:q.DISCONNECT}),Zo=class extends pe{constructor(e,t,n,i){super(e.logger),i&&(n.format=void 0,n.heartbeats=!0),this.connectionManager=e,this.auth=t,this.params=n,this.timeouts=n.options.timeouts,this.format=n.format,this.isConnected=!1,this.isFinished=!1,this.isDisposed=!1,this.maxIdleInterval=null,this.idleTimer=null,this.lastActivity=null}connect(){}close(){this.isConnected&&this.requestClose(),this.finish("closed",He.closed())}disconnect(e){this.isConnected&&this.requestDisconnect(),this.finish("disconnected",e||He.disconnected())}fail(e){this.isConnected&&this.requestDisconnect(),this.finish("failed",e||He.failed())}finish(e,t){var n;this.isFinished||(this.isFinished=!0,this.isConnected=!1,this.maxIdleInterval=null,clearTimeout((n=this.idleTimer)!=null?n:void 0),this.idleTimer=null,this.emit(e,t),this.dispose())}onProtocolMessage(e){switch(this.logger.shouldLog(o.LOG_MICRO)&&o.logActionNoStrip(this.logger,o.LOG_MICRO,"Transport.onProtocolMessage()","received on "+this.shortName+": "+An(e,this.connectionManager.realtime._RealtimePresence)+"; connectionId = "+this.connectionManager.connectionId),this.onActivity(),e.action){case q.HEARTBEAT:o.logActionNoStrip(this.logger,o.LOG_MICRO,"Transport.onProtocolMessage()",this.shortName+" heartbeat; connectionId = "+this.connectionManager.connectionId),this.emit("heartbeat",e.id);break;case q.CONNECTED:this.onConnect(e),this.emit("connected",e.error,e.connectionId,e.connectionDetails,e);break;case q.CLOSED:this.onClose(e);break;case q.DISCONNECTED:this.onDisconnect(e);break;case q.ACK:this.emit("ack",e.msgSerial,e.count);break;case q.NACK:this.emit("nack",e.msgSerial,e.count,e.error);break;case q.SYNC:this.connectionManager.onChannelMessage(e,this);break;case q.ACTIVATE:break;case q.AUTH:_e(this.auth.authorize(),t=>{t&&o.logAction(this.logger,o.LOG_ERROR,"Transport.onProtocolMessage()","Ably requested re-authentication, but unable to obtain a new token: "+J(t))});break;case q.ERROR:if(o.logAction(this.logger,o.LOG_MINOR,"Transport.onProtocolMessage()","received error action; connectionId = "+this.connectionManager.connectionId+"; err = "+m.Config.inspect(e.error)+(e.channel?", channel: "+e.channel:"")),e.channel===void 0){this.onFatalError(e);break}this.connectionManager.onChannelMessage(e,this);break;default:this.connectionManager.onChannelMessage(e,this)}}onConnect(e){if(this.isConnected=!0,!e.connectionDetails)throw new Error("Transport.onConnect(): Connect message recieved without connectionDetails");let t=e.connectionDetails.maxIdleInterval;t&&(this.maxIdleInterval=t+this.timeouts.realtimeRequestTimeout,this.onActivity())}onDisconnect(e){let t=e&&e.error;o.logAction(this.logger,o.LOG_MINOR,"Transport.onDisconnect()","err = "+J(t)),this.finish("disconnected",t)}onFatalError(e){let t=e&&e.error;o.logAction(this.logger,o.LOG_MINOR,"Transport.onFatalError()","err = "+J(t)),this.finish("failed",t)}onClose(e){let t=e&&e.error;o.logAction(this.logger,o.LOG_MINOR,"Transport.onClose()","err = "+J(t)),this.finish("closed",t)}requestClose(){o.logAction(this.logger,o.LOG_MINOR,"Transport.requestClose()",""),this.send(Xo)}requestDisconnect(){o.logAction(this.logger,o.LOG_MINOR,"Transport.requestDisconnect()",""),this.send(Yo)}ping(e){let t={action:q.HEARTBEAT};e&&(t.id=e),this.send(Me(t))}dispose(){o.logAction(this.logger,o.LOG_MINOR,"Transport.dispose()",""),this.isDisposed=!0,this.off()}onActivity(){this.maxIdleInterval&&(this.lastActivity=this.connectionManager.lastActivity=Date.now(),this.setIdleTimer(this.maxIdleInterval+100))}setIdleTimer(e){this.idleTimer||(this.idleTimer=setTimeout(()=>{this.onIdleTimerExpire()},e))}onIdleTimerExpire(){if(!this.lastActivity||!this.maxIdleInterval)throw new Error("Transport.onIdleTimerExpire(): lastActivity/maxIdleInterval not set");this.idleTimer=null;let e=Date.now()-this.lastActivity,t=this.maxIdleInterval-e;if(t<=0){let n="No activity seen from realtime in "+e+"ms; assuming connection has dropped";o.logAction(this.logger,o.LOG_ERROR,"Transport.onIdleTimerExpire()",n),this.disconnect(new w(n,80003,408))}else this.setIdleTimer(t+100)}static tryConnect(e,t,n,i,s){let r=new e(t,n,i),l,u=function(f){clearTimeout(l),s({event:this.event,error:f})},g=t.options.timeouts.realtimeRequestTimeout;return l=setTimeout(()=>{r.off(["preconnect","disconnected","failed"]),r.dispose(),u.call({event:"disconnected"},new w("Timeout waiting for transport to indicate itself viable",5e4,500))},g),r.on(["failed","disconnected"],u),r.on("preconnect",function(){o.logAction(t.logger,o.LOG_MINOR,"Transport.tryConnect()","viable transport "+r),clearTimeout(l),r.off(["failed","disconnected"],u),s(null,r)}),r.connect(),r}static isAvailable(){throw new w("isAvailable not implemented for transport",5e4,500)}},tt=Zo,be;(e=>{e.WebSocket="web_socket",e.Comet="comet",e.XhrPolling="xhr_polling"})(be||(be={}));var ea=typeof global<"u"?global:typeof window<"u"?window:self,Sn=()=>{var e;return typeof m.WebStorage<"u"&&((e=m.WebStorage)==null?void 0:e.localSupported)},ut=()=>{var e;return typeof m.WebStorage<"u"&&((e=m.WebStorage)==null?void 0:e.sessionSupported)},ss=function(){},Tn="ably-transport-preference";function ta(e,t,n){let i;if(e.channel!==t.channel||(i=e.action)!==q.PRESENCE&&i!==q.MESSAGE||i!==t.action)return!1;let s=i===q.PRESENCE?"presence":"messages",r=e[s].concat(t[s]);return _n(r)>n||!X(r,"clientId")||!r.every(function(u){return!u.id})?!1:(e[s]=r,!0)}function Mn(e){try{return JSON.parse(e)}catch{return null}}var na=class{constructor(e,t,n,i){this.options=e,this.host=t,this.mode=n,this.connectionKey=i,this.format=e.useBinaryProtocol?"msgpack":"json"}getConnectParams(e){let t=e?ue(e):{},n=this.options;switch(this.mode){case"resume":t.resume=this.connectionKey;break;case"recover":{let i=Mn(n.recover);i&&(t.recover=i.connectionKey);break}default:}return n.clientId!==void 0&&(t.clientId=n.clientId),n.echoMessages===!1&&(t.echo="false"),this.format!==void 0&&(t.format=this.format),this.stream!==void 0&&(t.stream=this.stream),this.heartbeats!==void 0&&(t.heartbeats=this.heartbeats),t.v=U.protocolVersion,t.agent=un(this.options),n.transportParams!==void 0&&G(t,n.transportParams),t}toString(){let e="[mode="+this.mode;return this.host&&(e+=",host="+this.host),this.connectionKey&&(e+=",connectionKey="+this.connectionKey),this.format&&(e+=",format="+this.format),e+="]",e}},ia=class Is extends pe{constructor(t,n){super(t.logger),this.supportedTransports={},this.disconnectedRetryCount=0,this.pendingChannelMessagesState={isProcessing:!1,queue:[]},this.realtime=t,this.initTransports(),this.options=n;let i=n.timeouts,s=i.webSocketConnectTimeout+i.realtimeRequestTimeout;if(this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1,failState:"disconnected"},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:s,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},disconnected:{state:"disconnected",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:i.disconnectedRetryTimeout,failState:"disconnected"},suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:i.suspendedRetryTimeout,failState:"suspended"},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:i.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"closed"},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"failed"}},this.state=this.states.initialized,this.errorReason=null,this.queuedMessages=new ns(this.logger),this.msgSerial=0,this.connectionDetails=void 0,this.connectionId=void 0,this.connectionKey=void 0,this.connectionStateTtl=i.connectionStateTtl,this.maxIdleInterval=null,this.transports=xt(n.transports||U.defaultTransports,this.supportedTransports),this.transportPreference=null,this.transports.includes(be.WebSocket)&&(this.webSocketTransportAvailable=!0),this.transports.includes(be.XhrPolling)?this.baseTransport=be.XhrPolling:this.transports.includes(be.Comet)&&(this.baseTransport=be.Comet),this.httpHosts=U.getHosts(n),this.wsHosts=U.getHosts(n,!0),this.activeProtocol=null,this.host=null,this.lastAutoReconnectAttempt=null,this.lastActivity=null,this.forceFallbackHost=!1,this.connectCounter=0,this.wsCheckResult=null,this.webSocketSlowTimer=null,this.webSocketGiveUpTimer=null,this.abandonedWebSocket=!1,o.logAction(this.logger,o.LOG_MINOR,"Realtime.ConnectionManager()","started"),o.logAction(this.logger,o.LOG_MICRO,"Realtime.ConnectionManager()","requested transports = ["+(n.transports||U.defaultTransports)+"]"),o.logAction(this.logger,o.LOG_MICRO,"Realtime.ConnectionManager()","available transports = ["+this.transports+"]"),o.logAction(this.logger,o.LOG_MICRO,"Realtime.ConnectionManager()","http hosts = ["+this.httpHosts+"]"),!this.transports.length){let l="no requested transports available";throw o.logAction(this.logger,o.LOG_ERROR,"realtime.ConnectionManager()",l),new Error(l)}let r=m.Config.addEventListener;r&&(ut()&&typeof n.recover=="function"&&r("beforeunload",this.persistConnection.bind(this)),n.closeOnUnload===!0&&r("beforeunload",()=>{o.logAction(this.logger,o.LOG_MAJOR,"Realtime.ConnectionManager()","beforeunload event has triggered the connection to close as closeOnUnload is true"),this.requestState({state:"closing"})}),r("online",()=>{var l;this.state==this.states.disconnected||this.state==this.states.suspended?(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager caught browser \u2018online\u2019 event","reattempting connection"),this.requestState({state:"connecting"})):this.state==this.states.connecting&&((l=this.pendingTransport)==null||l.off(),this.disconnectAllTransports(),this.startConnect())}),r("offline",()=>{this.state==this.states.connected&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager caught browser \u2018offline\u2019 event","disconnecting active transport"),this.disconnectAllTransports())}))}static supportedTransports(t){let n={supportedTransports:{}};return this.initTransports(t,n),n.supportedTransports}static initTransports(t,n){let i=y(y({},m.Transports.bundledImplementations),t);[be.WebSocket,...m.Transports.order].forEach(s=>{let r=i[s];r&&r.isAvailable()&&(n.supportedTransports[s]=r)})}initTransports(){Is.initTransports(this.realtime._additionalTransportImplementations,this)}createTransportParams(t,n){return new na(this.options,t,n,this.connectionKey)}getTransportParams(t){(i=>{if(this.connectionKey){i("resume");return}if(typeof this.options.recover=="string"){i("recover");return}let s=this.options.recover,r=this.getSessionRecoverData(),l=this.sessionRecoveryName();if(r&&typeof s=="function"){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.getTransportParams()","Calling clientOptions-provided recover function with last session data (recovery scope: "+l+")"),s(r,u=>{u?(this.options.recover=r.recoveryKey,i("recover")):i("clean")});return}i("clean")})(i=>{let s=this.createTransportParams(null,i);if(i==="recover"){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.getTransportParams()","Transport recovery mode = recover; recoveryKey = "+this.options.recover);let r=Mn(this.options.recover);r&&(this.msgSerial=r.msgSerial)}else o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.getTransportParams()","Transport params = "+s.toString());t(s)})}tryATransport(t,n,i){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.tryATransport()","trying "+n),this.proposedTransport=tt.tryConnect(this.supportedTransports[n],this,this.realtime.auth,t,(s,r)=>{let l=this.state;if(l==this.states.closing||l==this.states.closed||l==this.states.failed){r&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.tryATransport()","connection "+l.state+" while we were attempting the transport; closing "+r),r.close()),i(!0);return}if(s){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.tryATransport()","transport "+n+" "+s.event+", err: "+s.error.toString()),Ue.isTokenErr(s.error)&&!(this.errorReason&&Ue.isTokenErr(this.errorReason))?(this.errorReason=s.error,_e(this.realtime.auth._forceNewToken(null,null),u=>{if(u){this.actOnErrorFromAuthorize(u);return}this.tryATransport(t,n,i)})):s.event==="failed"?(this.notifyState({state:"failed",error:s.error}),i(!0)):s.event==="disconnected"&&(Qo(s.error)?i(!1):(this.notifyState({state:this.states.connecting.failState,error:s.error}),i(!0)));return}o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.tryATransport()","viable transport "+n+"; setting pending"),this.setTransportPending(r,t),i(null,r)})}setTransportPending(t,n){let i=n.mode;o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.setTransportPending()","transport = "+t+"; mode = "+i),this.pendingTransport=t,this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),t.once("connected",(r,l,u)=>{this.activateTransport(r,t,l,u),i==="recover"&&this.options.recover&&(delete this.options.recover,this.unpersistConnection())});let s=this;t.on(["disconnected","closed","failed"],function(r){s.deactivateTransport(t,this.event,r)}),this.emit("transport.pending",t)}activateTransport(t,n,i,s){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","transport = "+n),t&&o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.activateTransport()","error = "+t),i&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.activateTransport()","connectionId = "+i),s&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.activateTransport()","connectionDetails = "+JSON.stringify(s)),this.persistTransportPreference(n);let r=this.state,l=this.states.connected.state;if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","current state = "+r.state),r.state==this.states.closing.state||r.state==this.states.closed.state||r.state==this.states.failed.state)return o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","Disconnecting transport and abandoning"),n.disconnect(),!1;if(delete this.pendingTransport,!n.isConnected)return o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","Declining to activate transport "+n+" since it appears to no longer be connected"),!1;let u=this.activeProtocol;this.activeProtocol=new Ko(n),this.host=n.params.host;let g=s.connectionKey;if(g&&this.connectionKey!=g&&this.setConnection(i,s,!!t),this.onConnectionDetailsUpdate(s,n),m.Config.nextTick(()=>{n.on("connected",(f,b,C)=>{this.onConnectionDetailsUpdate(C,n),this.emit("update",new jt(l,l,null,f))})}),r.state===this.states.connected.state?t&&(this.errorReason=this.realtime.connection.errorReason=t,this.emit("update",new jt(l,l,null,t))):(this.notifyState({state:"connected",error:t}),this.errorReason=this.realtime.connection.errorReason=t||null),this.emit("transport.active",n),u)if(u.messageQueue.count()>0&&o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.activateTransport()","Previous active protocol (for transport "+u.transport.shortName+", new one is "+n.shortName+") finishing with "+u.messageQueue.count()+" messages still pending"),u.transport===n){let f="Assumption violated: activating a transport that was also the transport for the previous active protocol; transport = "+n.shortName+"; stack = "+new Error().stack;o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.activateTransport()",f)}else u.finish();return!0}deactivateTransport(t,n,i){let s=this.activeProtocol,r=s&&s.getTransport()===t,l=t===this.pendingTransport,u=this.noTransportsScheduledForActivation();if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.deactivateTransport()","transport = "+t),o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.deactivateTransport()","state = "+n+(r?"; was active":l?"; was pending":"")+(u?"":"; another transport is scheduled for activation")),i&&i.message&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.deactivateTransport()","reason = "+i.message),r&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.deactivateTransport()","Getting, clearing, and requeuing "+this.activeProtocol.messageQueue.count()+" pending messages"),this.queuePendingMessages(s.getPendingMessages()),s.clearPendingMessages(),this.activeProtocol=this.host=null),this.emit("transport.inactive",t),r&&u||r&&n==="failed"||n==="closed"||s===null&&l){if(n==="disconnected"&&i&&i.statusCode>500&&this.httpHosts.length>1){this.unpersistTransportPreference(),this.forceFallbackHost=!0,this.notifyState({state:n,error:i,retryImmediately:!0});return}let g=n==="failed"&&Ue.isTokenErr(i)?"disconnected":n;this.notifyState({state:g,error:i});return}}noTransportsScheduledForActivation(){return!this.pendingTransport||!this.pendingTransport.isConnected}setConnection(t,n,i){let s=this.connectionId;(s&&s!==t||!s&&i)&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.setConnection()","Resetting msgSerial"),this.msgSerial=0,this.queuedMessages.resetSendAttempted()),this.connectionId!==t&&o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.setConnection()","New connectionId; reattaching any attached channels"),this.realtime.connection.id=this.connectionId=t,this.realtime.connection.key=this.connectionKey=n.connectionKey}clearConnection(){this.realtime.connection.id=this.connectionId=void 0,this.realtime.connection.key=this.connectionKey=void 0,this.msgSerial=0,this.unpersistConnection()}createRecoveryKey(){return this.connectionKey?JSON.stringify({connectionKey:this.connectionKey,msgSerial:this.msgSerial,channelSerials:this.realtime.channels.channelSerials()}):null}checkConnectionStateFreshness(){if(!this.lastActivity||!this.connectionId)return;let t=Date.now()-this.lastActivity;t>this.connectionStateTtl+this.maxIdleInterval&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.checkConnectionStateFreshness()","Last known activity from realtime was "+t+"ms ago; discarding connection state"),this.clearConnection(),this.states.connecting.failState="suspended")}persistConnection(){if(ut()){let t=this.createRecoveryKey();t&&this.setSessionRecoverData({recoveryKey:t,disconnectedAt:Date.now(),location:ea.location,clientId:this.realtime.auth.clientId})}}unpersistConnection(){this.clearSessionRecoverData()}getError(){if(this.errorReason){let t=ce.fromValues(this.errorReason);return t.cause=this.errorReason,t}return this.getStateError()}getStateError(){var t,n;return(n=(t=He)[this.state.state])==null?void 0:n.call(t)}activeState(){return this.state.queueEvents||this.state.sendEvents}enactStateChange(t){let n="Connection state",i=t.current+(t.reason?"; reason: "+t.reason:"");t.current==="failed"?o.logAction(this.logger,o.LOG_ERROR,n,i):o.logAction(this.logger,o.LOG_MAJOR,n,i),o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.enactStateChange","setting new state: "+t.current+"; reason = "+(t.reason&&t.reason.message));let s=this.state=this.states[t.current];t.reason&&(this.errorReason=t.reason,this.realtime.connection.errorReason=t.reason),(s.terminal||s.state==="suspended")&&this.clearConnection(),this.emit("connectionstate",t)}startTransitionTimer(t){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startTransitionTimer()","transitionState: "+t.state),this.transitionTimer&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startTransitionTimer()","clearing already-running timer"),clearTimeout(this.transitionTimer)),this.transitionTimer=setTimeout(()=>{this.transitionTimer&&(this.transitionTimer=null,o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager "+t.state+" timer expired","requesting new state: "+t.failState),this.notifyState({state:t.failState}))},t.retryDelay)}cancelTransitionTimer(){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.cancelTransitionTimer()",""),this.transitionTimer&&(clearTimeout(this.transitionTimer),this.transitionTimer=null)}startSuspendTimer(){this.suspendTimer||(this.suspendTimer=setTimeout(()=>{this.suspendTimer&&(this.suspendTimer=null,o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager suspend timer expired","requesting new state: suspended"),this.states.connecting.failState="suspended",this.notifyState({state:"suspended"}))},this.connectionStateTtl))}checkSuspendTimer(t){t!=="disconnected"&&t!=="suspended"&&t!=="connecting"&&this.cancelSuspendTimer()}cancelSuspendTimer(){this.states.connecting.failState="disconnected",this.suspendTimer&&(clearTimeout(this.suspendTimer),this.suspendTimer=null)}startRetryTimer(t){this.retryTimer=setTimeout(()=>{o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager retry timer expired","retrying"),this.retryTimer=null,this.requestState({state:"connecting"})},t)}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}startWebSocketSlowTimer(){this.webSocketSlowTimer=setTimeout(()=>{o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket slow timer","checking connectivity"),this.checkWsConnectivity().then(()=>{o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket slow timer","ws connectivity check succeeded"),this.wsCheckResult=!0}).catch(()=>{o.logAction(this.logger,o.LOG_MAJOR,"ConnectionManager WebSocket slow timer","ws connectivity check failed"),this.wsCheckResult=!1}),this.realtime.http.checkConnectivity&&_e(this.realtime.http.checkConnectivity(),(t,n)=>{t||!n?(o.logAction(this.logger,o.LOG_MAJOR,"ConnectionManager WebSocket slow timer","http connectivity check failed"),this.cancelWebSocketGiveUpTimer(),this.notifyState({state:"disconnected",error:new w("Unable to connect (network unreachable)",80003,404)})):o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket slow timer","http connectivity check succeeded")})},this.options.timeouts.webSocketSlowTimeout)}cancelWebSocketSlowTimer(){this.webSocketSlowTimer&&(clearTimeout(this.webSocketSlowTimer),this.webSocketSlowTimer=null)}startWebSocketGiveUpTimer(t){this.webSocketGiveUpTimer=setTimeout(()=>{var n,i;this.wsCheckResult||(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket give up timer","websocket connection took more than 10s; "+(this.baseTransport?"trying base transport":"")),this.baseTransport?(this.abandonedWebSocket=!0,(n=this.proposedTransport)==null||n.dispose(),(i=this.pendingTransport)==null||i.dispose(),this.connectBase(t,++this.connectCounter)):o.logAction(this.logger,o.LOG_MAJOR,"ConnectionManager WebSocket give up timer","websocket connectivity appears to be unavailable but no other transports to try"))},this.options.timeouts.webSocketConnectTimeout)}cancelWebSocketGiveUpTimer(){this.webSocketGiveUpTimer&&(clearTimeout(this.webSocketGiveUpTimer),this.webSocketGiveUpTimer=null)}notifyState(t){var n,i;let s=t.state,r=s==="disconnected"&&(this.state===this.states.connected||t.retryImmediately||this.state===this.states.connecting&&t.error&&Ue.isTokenErr(t.error)&&!(this.errorReason&&Ue.isTokenErr(this.errorReason)));if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.notifyState()","new state: "+s+(r?"; will retry connection immediately":"")),s==this.state.state||(this.cancelTransitionTimer(),this.cancelRetryTimer(),this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.checkSuspendTimer(t.state),(s==="suspended"||s==="connected")&&(this.disconnectedRetryCount=0),this.state.terminal))return;let l=this.states[t.state],u=l.retryDelay;l.state==="disconnected"&&(this.disconnectedRetryCount++,u=ln(l.retryDelay,this.disconnectedRetryCount));let g=new jt(this.state.state,l.state,u,t.error||((i=(n=He)[l.state])==null?void 0:i.call(n)));if(r){let f=()=>{this.state===this.states.disconnected&&(this.lastAutoReconnectAttempt=Date.now(),this.requestState({state:"connecting"}))},b=this.lastAutoReconnectAttempt&&Date.now()-this.lastAutoReconnectAttempt+1;b&&b<1e3?(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.notifyState()","Last reconnect attempt was only "+b+"ms ago, waiting another "+(1e3-b)+"ms before trying again"),setTimeout(f,1e3-b)):m.Config.nextTick(f)}else(s==="disconnected"||s==="suspended")&&this.startRetryTimer(u);(s==="disconnected"&&!r||s==="suspended"||l.terminal)&&m.Config.nextTick(()=>{this.disconnectAllTransports()}),s=="connected"&&!this.activeProtocol&&o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.notifyState()","Broken invariant: attempted to go into connected state, but there is no active protocol"),this.enactStateChange(g),this.state.sendEvents?this.sendQueuedMessages():this.state.queueEvents||(this.realtime.channels.propogateConnectionInterruption(s,g.reason),this.failQueuedMessages(g.reason))}requestState(t){var n,i;let s=t.state;if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.requestState()","requested state: "+s+"; current state: "+this.state.state),s==this.state.state||(this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.cancelTransitionTimer(),this.cancelRetryTimer(),this.checkSuspendTimer(s),s=="connecting"&&this.state.state=="connected")||s=="closing"&&this.state.state=="closed")return;let r=this.states[s],l=new jt(this.state.state,r.state,null,t.error||((i=(n=He)[r.state])==null?void 0:i.call(n)));this.enactStateChange(l),s=="connecting"&&m.Config.nextTick(()=>{this.startConnect()}),s=="closing"&&this.closeImpl()}startConnect(){if(this.state!==this.states.connecting){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startConnect()","Must be in connecting state to connect, but was "+this.state.state);return}let t=this.realtime.auth,n=++this.connectCounter,i=()=>{this.checkConnectionStateFreshness(),this.getTransportParams(s=>{if(s.mode==="recover"&&s.options.recover){let r=Mn(s.options.recover);r&&this.realtime.channels.recoverChannels(r.channelSerials)}n===this.connectCounter&&this.connectImpl(s,n)})};if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startConnect()","starting connection"),this.startSuspendTimer(),this.startTransitionTimer(this.states.connecting),t.method==="basic")i();else{let s=r=>{n===this.connectCounter&&(r?this.actOnErrorFromAuthorize(r):i())};this.errorReason&&Ue.isTokenErr(this.errorReason)?_e(t._forceNewToken(null,null),s):_e(t._ensureValidAuthCredentials(!1),s)}}connectImpl(t,n){let i=this.state.state;if(i!==this.states.connecting.state){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.connectImpl()","Must be in connecting state to connect, but was "+i);return}let s=this.getTransportPreference();s&&s===this.baseTransport&&this.webSocketTransportAvailable&&this.checkWsConnectivity().then(()=>{this.unpersistTransportPreference(),this.state===this.states.connecting&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.connectImpl():","web socket connectivity available, cancelling connection attempt with "+this.baseTransport),this.disconnectAllTransports(),this.connectWs(t,++this.connectCounter))}).catch(ss),s&&s===this.baseTransport||this.baseTransport&&!this.webSocketTransportAvailable?this.connectBase(t,n):this.connectWs(t,n)}connectWs(t,n){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.connectWs()"),this.wsCheckResult=null,this.abandonedWebSocket=!1,this.startWebSocketSlowTimer(),this.startWebSocketGiveUpTimer(t),this.tryTransportWithFallbacks("web_socket",t,!0,n,()=>this.wsCheckResult!==!1&&!this.abandonedWebSocket)}connectBase(t,n){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.connectBase()"),this.baseTransport?this.tryTransportWithFallbacks(this.baseTransport,t,!1,n,()=>!0):this.notifyState({state:"disconnected",error:new w("No transports left to try",8e4,404)})}tryTransportWithFallbacks(t,n,i,s,r){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.tryTransportWithFallbacks()",t);let l=C=>{this.notifyState({state:this.states.connecting.failState,error:C})},u=i?this.wsHosts.slice():this.httpHosts.slice(),g=(C,O)=>{if(s===this.connectCounter){if(!r()){O&&O.dispose();return}!O&&!C&&b()}},f=u.shift();if(!f){l(new w("Unable to connect (no available host)",80003,404));return}n.host=f;let b=()=>{if(!u.length){l(new w("Unable to connect (and no more fallback hosts to try)",80003,404));return}if(!this.realtime.http.checkConnectivity){l(new ce("Internal error: Http.checkConnectivity not set",null,500));return}_e(this.realtime.http.checkConnectivity(),(C,O)=>{if(s===this.connectCounter&&r()){if(C){l(C);return}if(!O){l(new w("Unable to connect (network unreachable)",80003,404));return}n.host=Y(u),this.tryATransport(n,t,g)}})};if(this.forceFallbackHost&&u.length){this.forceFallbackHost=!1,b();return}this.tryATransport(n,t,g)}closeImpl(){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.closeImpl()","closing connection"),this.cancelSuspendTimer(),this.startTransitionTimer(this.states.closing),this.pendingTransport&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.closeImpl()","Closing pending transport: "+this.pendingTransport),this.pendingTransport.close()),this.activeProtocol&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.closeImpl()","Closing active transport: "+this.activeProtocol.getTransport()),this.activeProtocol.getTransport().close()),this.notifyState({state:"closed"})}onAuthUpdated(t,n){var i;switch(this.state.state){case"connected":{o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.onAuthUpdated()","Sending AUTH message on active transport");let s=(i=this.activeProtocol)==null?void 0:i.getTransport();s&&s.onAuthUpdated&&s.onAuthUpdated(t);let r=Me({action:q.AUTH,auth:{accessToken:t.token}});this.send(r);let l=()=>{this.off(u),n(null,t)},u=g=>{g.current==="failed"&&(this.off(l),this.off(u),n(g.reason||this.getStateError()))};this.once("connectiondetails",l),this.on("connectionstate",u);break}case"connecting":o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.onAuthUpdated()","Aborting current connection attempts in order to start again with the new auth details"),this.disconnectAllTransports();default:{o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.onAuthUpdated()","Connection state is "+this.state.state+"; waiting until either connected or failed");let s=r=>{switch(r.current){case"connected":this.off(s),n(null,t);break;case"failed":case"closed":case"suspended":this.off(s),n(r.reason||this.getStateError());break;default:break}};this.on("connectionstate",s),this.state.state==="connecting"?this.startConnect():this.requestState({state:"connecting"})}}}disconnectAllTransports(){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.disconnectAllTransports()","Disconnecting all transports"),this.connectCounter++,this.pendingTransport&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.disconnectAllTransports()","Disconnecting pending transport: "+this.pendingTransport),this.pendingTransport.disconnect()),delete this.pendingTransport,this.proposedTransport&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.disconnectAllTransports()","Disconnecting proposed transport: "+this.pendingTransport),this.proposedTransport.disconnect()),delete this.pendingTransport,this.activeProtocol&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.disconnectAllTransports()","Disconnecting active transport: "+this.activeProtocol.getTransport()),this.activeProtocol.getTransport().disconnect())}send(t,n,i){i=i||ss;let s=this.state;if(s.sendEvents){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.send()","sending event"),this.sendImpl(new is(t,i));return}if(!(n&&s.queueEvents)){let l="rejecting event, queueEvent was "+n+", state was "+s.state;o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.send()",l),i(this.errorReason||new w(l,9e4,400));return}this.logger.shouldLog(o.LOG_MICRO)&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.send()","queueing msg; "+An(t,this.realtime._RealtimePresence)),this.queue(t,i)}sendImpl(t){let n=t.message;t.ackRequired&&!t.sendAttempted&&(n.msgSerial=this.msgSerial++);try{this.activeProtocol.send(t)}catch(i){o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.sendImpl()","Unexpected exception in transport.send(): "+i.stack)}}queue(t,n){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.queue()","queueing event");let i=this.queuedMessages.last(),s=this.options.maxMessageSize;i&&!i.sendAttempted&&ta(i.message,t,s)?(i.merged||(i.callback=dn.create(this.logger,[i.callback]),i.merged=!0),i.callback.push(n)):this.queuedMessages.push(new is(t,n))}sendQueuedMessages(){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.sendQueuedMessages()","sending "+this.queuedMessages.count()+" queued messages");let t;for(;t=this.queuedMessages.shift();)this.sendImpl(t)}queuePendingMessages(t){t&&t.length&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.queuePendingMessages()","queueing "+t.length+" pending messages"),this.queuedMessages.prepend(t))}failQueuedMessages(t){let n=this.queuedMessages.count();n>0&&(o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.failQueuedMessages()","failing "+n+" queued messages, err = "+J(t)),this.queuedMessages.completeAllMessages(t))}onChannelMessage(t,n){this.pendingChannelMessagesState.queue.push({message:t,transport:n}),this.pendingChannelMessagesState.isProcessing||this.processNextPendingChannelMessage()}processNextPendingChannelMessage(){if(this.pendingChannelMessagesState.queue.length>0){this.pendingChannelMessagesState.isProcessing=!0;let t=this.pendingChannelMessagesState.queue.shift();this.processChannelMessage(t.message).catch(n=>{o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.processNextPendingChannelMessage() received error ",n)}).finally(()=>{this.pendingChannelMessagesState.isProcessing=!1,this.processNextPendingChannelMessage()})}}async processChannelMessage(t){await this.realtime.channels.processChannelMessage(t)}async ping(){var t;if(this.state.state!=="connected")throw new w("Unable to ping service; not connected",4e4,400);let n=(t=this.activeProtocol)==null?void 0:t.getTransport();if(!n)throw this.getStateError();o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.ping()","transport = "+n);let i=Date.now(),s=Lt();return bi(new Promise(r=>{let l=u=>{u===s&&(n.off("heartbeat",l),r(Date.now()-i))};n.on("heartbeat",l),n.ping(s)}),this.options.timeouts.realtimeRequestTimeout,"Timeout waiting for heartbeat response")}abort(t){this.activeProtocol.getTransport().fail(t)}getTransportPreference(){var t,n;return this.transportPreference||Sn()&&((n=(t=m.WebStorage)==null?void 0:t.get)==null?void 0:n.call(t,Tn))}persistTransportPreference(t){var n,i;this.transportPreference=t.shortName,Sn()&&((i=(n=m.WebStorage)==null?void 0:n.set)==null||i.call(n,Tn,t.shortName))}unpersistTransportPreference(){var t,n;this.transportPreference=null,Sn()&&((n=(t=m.WebStorage)==null?void 0:t.remove)==null||n.call(t,Tn))}actOnErrorFromAuthorize(t){if(t.code===40171)this.notifyState({state:"failed",error:t});else if(t.code===40102)this.notifyState({state:"failed",error:t});else if(t.statusCode===qt.Forbidden){let n="Client configured authentication provider returned 403; failing the connection";o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.actOnErrorFromAuthorize()",n),this.notifyState({state:"failed",error:new w(n,80019,403,t)})}else{let n="Client configured authentication provider request failed";o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.actOnErrorFromAuthorize",n),this.notifyState({state:this.state.failState,error:new w(n,80019,401,t)})}}onConnectionDetailsUpdate(t,n){if(!t)return;this.connectionDetails=t,t.maxMessageSize&&(this.options.maxMessageSize=t.maxMessageSize);let i=t.clientId;if(i){let r=this.realtime.auth._uncheckedSetClientId(i);if(r){o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.onConnectionDetailsUpdate()",r.message),n.fail(r);return}}let s=t.connectionStateTtl;s&&(this.connectionStateTtl=s),this.maxIdleInterval=t.maxIdleInterval,this.emit("connectiondetails",t)}checkWsConnectivity(){let t=this.options.wsConnectivityCheckUrl||U.wsConnectivityCheckUrl,n=new m.Config.WebSocket(t);return new Promise((i,s)=>{let r=!1;n.onopen=()=>{r||(r=!0,i(),n.close())},n.onclose=n.onerror=()=>{r||(r=!0,s())}})}sessionRecoveryName(){return this.options.recoveryKeyStorageName||"ably-connection-recovery"}getSessionRecoverData(){var t,n;return ut()&&((n=(t=m.WebStorage)==null?void 0:t.getSession)==null?void 0:n.call(t,this.sessionRecoveryName()))}setSessionRecoverData(t){var n,i;return ut()&&((i=(n=m.WebStorage)==null?void 0:n.setSession)==null?void 0:i.call(n,this.sessionRecoveryName(),t))}clearSessionRecoverData(){var t,n;return ut()&&((n=(t=m.WebStorage)==null?void 0:t.removeSession)==null?void 0:n.call(t,this.sessionRecoveryName()))}},rs=ia,sa=class extends pe{constructor(e,t){super(e.logger),this.whenState=n=>pe.prototype.whenState.call(this,n,this.state),this.ably=e,this.connectionManager=new rs(e,t),this.state=this.connectionManager.state.state,this.key=void 0,this.id=void 0,this.errorReason=null,this.connectionManager.on("connectionstate",n=>{let i=this.state=n.current;m.Config.nextTick(()=>{this.emit(i,n)})}),this.connectionManager.on("update",n=>{m.Config.nextTick(()=>{this.emit("update",n)})})}connect(){o.logAction(this.logger,o.LOG_MINOR,"Connection.connect()",""),this.connectionManager.requestState({state:"connecting"})}async ping(){return o.logAction(this.logger,o.LOG_MINOR,"Connection.ping()",""),this.connectionManager.ping()}close(){o.logAction(this.logger,o.LOG_MINOR,"Connection.close()","connectionKey = "+this.key),this.connectionManager.requestState({state:"closing"})}get recoveryKey(){return this.logger.deprecationWarning("The `Connection.recoveryKey` attribute has been replaced by the `Connection.createRecoveryKey()` method. Replace your usage of `recoveryKey` with the return value of `createRecoveryKey()`. `recoveryKey` will be removed in a future version."),this.createRecoveryKey()}createRecoveryKey(){return this.connectionManager.createRecoveryKey()}},ra=sa,oa=class{constructor(e,t,n,i,s){this.previous=e,this.current=t,t==="attached"&&(this.resumed=n,this.hasBacklog=i),s&&(this.reason=s)}},xn=oa,os=function(){};function aa(e){if(e&&"params"in e&&!de(e.params))return new w("options.params must be an object",4e4,400);if(e&&"modes"in e){if(!Array.isArray(e.modes))return new w("options.modes must be an array",4e4,400);for(let t=0;t<e.modes.length;t++){let n=e.modes[t];if(!n||typeof n!="string"||!es.includes(String.prototype.toUpperCase.call(n)))return new w("Invalid channel mode: "+n,4e4,400)}}}var ca=class Kn extends pe{constructor(t,n,i){var s,r;super(t.logger),this.retryCount=0,this.history=async function(l){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.history()","channel = "+this.name);let u=this.client.rest.channelMixin;if(l&&l.untilAttach){if(this.state!=="attached")throw new w("option untilAttach requires the channel to be attached",4e4,400);if(!this.properties.attachSerial)throw new w("untilAttach was specified and channel is attached, but attachSerial is not defined",4e4,400);delete l.untilAttach,l.from_serial=this.properties.attachSerial}return u.history(this,l)},this.whenState=l=>pe.prototype.whenState.call(this,l,this.state),o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel()","started; name = "+n),this.name=n,this.channelOptions=Bt((s=t._Crypto)!=null?s:null,this.logger,i),this.client=t,this._presence=t._RealtimePresence?new t._RealtimePresence.RealtimePresence(this):null,this.connectionManager=t.connection.connectionManager,this.state="initialized",this.subscriptions=new pe(this.logger),this.syncChannelSerial=void 0,this.properties={attachSerial:void 0,channelSerial:void 0},this.setOptions(i),this.errorReason=null,this._requestedFlags=null,this._mode=null,this._attachResume=!1,this._decodingContext={channelOptions:this.channelOptions,plugins:t.options.plugins||{},baseEncodedPreviousPayload:void 0},this._lastPayload={messageId:null,protocolMessageChannelSerial:null,decodeFailureRecoveryInProgress:null},this._allChannelChanges=new pe(this.logger),(r=t.options.plugins)!=null&&r.Push&&(this._push=new t.options.plugins.Push.PushChannel(this))}get presence(){return this._presence||we("RealtimePresence"),this._presence}get push(){return this._push||we("Push"),this._push}invalidStateError(){return new w("Channel operation failed as channel state is "+this.state,90001,400,this.errorReason||void 0)}static processListenerArgs(t){return t=Array.prototype.slice.call(t),typeof t[0]=="function"&&t.unshift(null),t}async setOptions(t){var n;let i=this.channelOptions,s=aa(t);if(s)throw s;if(this.channelOptions=Bt((n=this.client._Crypto)!=null?n:null,this.logger,t),this._decodingContext&&(this._decodingContext.channelOptions=this.channelOptions),this._shouldReattachToSetOptions(t,i))return this.attachImpl(),new Promise((r,l)=>{this._allChannelChanges.once(["attached","update","detached","failed"],function(u){switch(this.event){case"update":case"attached":r();break;default:l(u.reason)}})})}_shouldReattachToSetOptions(t,n){if(!(this.state==="attached"||this.state==="attaching"))return!1;if(t?.params){let i=as(t.params),s=as(n.params);if(Object.keys(i).length!==Object.keys(s).length||!yi(s,i))return!0}return!!(t?.modes&&(!n.modes||!_i(t.modes,n.modes)))}async publish(...t){let n=t[0],i=t.length;if(!this.connectionManager.activeState())throw this.connectionManager.getError();if(i==1)if(de(n))n=[Ze(n)];else if(Array.isArray(n))n=vn(n);else throw new w("The single-argument form of publish() expects a message object or an array of message objects",40013,400);else n=[Ze({name:t[0],data:t[1]})];let s=this.client.options.maxMessageSize;await Hi(n,this.channelOptions);let r=_n(n);if(r>s)throw new w("Maximum size of messages that can be published at once exceeded ( was "+r+" bytes; limit is "+s+" bytes)",40009,400);return new Promise((l,u)=>{this._publish(n,g=>g?u(g):l())})}_publish(t,n){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.publish()","message count = "+t.length);let i=this.state;switch(i){case"failed":case"suspended":n(w.fromValues(this.invalidStateError()));break;default:{o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.publish()","sending message; channel state is "+i);let s=new ts;s.action=q.MESSAGE,s.channel=this.name,s.messages=t,this.sendMessage(s,n);break}}}onEvent(t){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.onEvent()","received message");let n=this.subscriptions;for(let i=0;i<t.length;i++){let s=t[i];n.emit(s.name,s)}}async attach(){return this.state==="attached"?null:new Promise((t,n)=>{this._attach(!1,null,(i,s)=>i?n(i):t(s))})}_attach(t,n,i){i||(i=r=>{r&&o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel._attach()","Channel attach failed: "+r.toString())});let s=this.connectionManager;if(!s.activeState()){i(s.getError());return}(this.state!=="attaching"||t)&&this.requestState("attaching",n),this.once(function(r){switch(this.event){case"attached":i?.(null,r);break;case"detached":case"suspended":case"failed":i?.(r.reason||s.getError()||new w("Unable to attach; reason unknown; state = "+this.event,9e4,500));break;case"detaching":i?.(new w("Attach request superseded by a subsequent detach request",9e4,409));break}})}attachImpl(){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.attachImpl()","sending ATTACH message");let t=Me({action:q.ATTACH,channel:this.name,params:this.channelOptions.params,channelSerial:this.properties.channelSerial});this._requestedFlags?t.encodeModesToFlags(this._requestedFlags):this.channelOptions.modes&&t.encodeModesToFlags(pi(this.channelOptions.modes)),this._attachResume&&t.setFlag("ATTACH_RESUME"),this._lastPayload.decodeFailureRecoveryInProgress&&(t.channelSerial=this._lastPayload.protocolMessageChannelSerial),this.sendMessage(t,os)}async detach(){let t=this.connectionManager;if(!t.activeState())throw t.getError();switch(this.state){case"suspended":this.notifyState("detached");return;case"detached":return;case"failed":throw new w("Unable to detach; channel state = failed",90001,400);default:this.requestState("detaching");case"detaching":return new Promise((n,i)=>{this.once(function(s){switch(this.event){case"detached":n();break;case"attached":case"suspended":case"failed":i(s.reason||t.getError()||new w("Unable to detach; reason unknown; state = "+this.event,9e4,500));break;case"attaching":i(new w("Detach request superseded by a subsequent attach request",9e4,409));break}})})}}detachImpl(t){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.detach()","sending DETACH message");let n=Me({action:q.DETACH,channel:this.name});this.sendMessage(n,t||os)}async subscribe(...t){let[n,i]=Kn.processListenerArgs(t);if(this.state==="failed")throw w.fromValues(this.invalidStateError());return n&&typeof n=="object"&&!Array.isArray(n)?this.client._FilteredSubscriptions.subscribeFilter(this,n,i):this.subscriptions.on(n,i),this.attach()}unsubscribe(...t){var n;let[i,s]=Kn.processListenerArgs(t);if(typeof i=="object"&&!s||(n=this.filteredSubscriptions)!=null&&n.has(s)){this.client._FilteredSubscriptions.getAndDeleteFilteredSubscriptions(this,i,s).forEach(r=>this.subscriptions.off(r));return}this.subscriptions.off(i,s)}sync(){switch(this.state){case"initialized":case"detaching":case"detached":throw new ce("Unable to sync to channel; not attached",4e4);default:}let t=this.connectionManager;if(!t.activeState())throw t.getError();let n=Me({action:q.SYNC,channel:this.name});this.syncChannelSerial&&(n.channelSerial=this.syncChannelSerial),t.send(n)}sendMessage(t,n){this.connectionManager.send(t,this.client.options.queueMessages,n)}sendPresence(t,n){let i=Me({action:q.PRESENCE,channel:this.name,presence:Array.isArray(t)?this.client._RealtimePresence.presenceMessagesFromValuesArray(t):[this.client._RealtimePresence.presenceMessageFromValues(t)]});this.sendMessage(i,n)}async processMessage(t){(t.action===q.ATTACHED||t.action===q.MESSAGE||t.action===q.PRESENCE)&&this.setChannelSerial(t.channelSerial);let n,i=!1;switch(t.action){case q.ATTACHED:{this.properties.attachSerial=t.channelSerial,this._mode=t.getMode(),this.params=t.params||{};let s=t.decodeModesFromFlags();this.modes=s&&cn(s)||void 0;let r=t.hasFlag("RESUMED"),l=t.hasFlag("HAS_PRESENCE"),u=t.hasFlag("HAS_BACKLOG");if(this.state==="attached"){r||this._presence&&this._presence.onAttached(l);let g=new xn(this.state,this.state,r,u,t.error);this._allChannelChanges.emit("update",g),(!r||this.channelOptions.updateOnAttached)&&this.emit("update",g)}else this.state==="detaching"?this.checkPendingState():this.notifyState("attached",t.error,r,l,u);break}case q.DETACHED:{let s=t.error?w.fromValues(t.error):new w("Channel detached",90001,404);this.state==="detaching"?this.notifyState("detached",s):this.state==="attaching"?this.notifyState("suspended",s):(this.state==="attached"||this.state==="suspended")&&this.requestState("attaching",s);break}case q.SYNC:if(i=!0,n=this.syncChannelSerial=t.channelSerial,!t.presence)break;case q.PRESENCE:{let s=t.presence;if(!s)break;let r=this.channelOptions;await this._decodeAndPrepareMessages(t,s,l=>wn(l,r)),this._presence&&this._presence.setPresence(s,i,n);break}case q.MESSAGE:{if(this.state!=="attached"){o.logAction(this.logger,o.LOG_MAJOR,"RealtimeChannel.processMessage()",'Message "'+t.id+'" skipped as this channel "'+this.name+'" state is not "attached" (state is "'+this.state+'").');return}let s=t.messages,r=s[0],l=s[s.length-1],u=t.channelSerial;if(r.extras&&r.extras.delta&&r.extras.delta.from!==this._lastPayload.messageId){let f='Delta message decode failure - previous message not available for message "'+t.id+'" on this channel "'+this.name+'".';o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel.processMessage()",f),this._startDecodeFailureRecovery(new w(f,40018,400));break}let{unrecoverableError:g}=await this._decodeAndPrepareMessages(t,s,f=>ht(f,this._decodingContext),f=>{let b=f;switch(b.code){case 40018:return this._startDecodeFailureRecovery(b),{unrecoverableError:!0};case 40019:case 40021:return this.notifyState("failed",b),{unrecoverableError:!0};default:return{unrecoverableError:!1}}});if(g)return;for(let f=0;f<s.length;f++){let b=s[f];u&&!b.version&&(b.version=u+":"+f.toString().padStart(3,"0"),b.expandFields())}this._lastPayload.messageId=l.id,this._lastPayload.protocolMessageChannelSerial=t.channelSerial,this.onEvent(s);break}case q.ERROR:{let s=t.error;s&&s.code==80016?this.checkPendingState():this.notifyState("failed",w.fromValues(s));break}default:o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel.processMessage()","Fatal protocol error: unrecognised action ("+t.action+")"),this.connectionManager.abort(He.unknownChannelErr())}}async _decodeAndPrepareMessages(t,n,i,s){let{id:r,connectionId:l,timestamp:u}=t;for(let g=0;g<n.length;g++){let f=n[g];try{await i(f)}catch(b){if(o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel.decodeAndPrepareMessages()",b.toString()),s){let{unrecoverableError:C}=s(b);if(C)return{unrecoverableError:!0}}}f.connectionId||(f.connectionId=l),f.timestamp||(f.timestamp=u),r&&!f.id&&(f.id=r+":"+g)}return{unrecoverableError:!1}}_startDecodeFailureRecovery(t){this._lastPayload.decodeFailureRecoveryInProgress||(o.logAction(this.logger,o.LOG_MAJOR,"RealtimeChannel.processMessage()","Starting decode failure recovery process."),this._lastPayload.decodeFailureRecoveryInProgress=!0,this._attach(!0,t,()=>{this._lastPayload.decodeFailureRecoveryInProgress=!1}))}onAttached(){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.onAttached","activating channel; name = "+this.name)}notifyState(t,n,i,s,r){if(o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.notifyState","name = "+this.name+", current state = "+this.state+", notifying state "+t),this.clearStateTimer(),["detached","suspended","failed"].includes(t)&&(this.properties.channelSerial=null),t===this.state)return;this._presence&&this._presence.actOnChannelState(t,s,n),t==="suspended"&&this.connectionManager.state.sendEvents?this.startRetryTimer():this.cancelRetryTimer(),n&&(this.errorReason=n);let l=new xn(this.state,t,i,r,n),u='Channel state for channel "'+this.name+'"',g=t+(n?"; reason: "+n:"");t==="failed"?o.logAction(this.logger,o.LOG_ERROR,u,g):o.logAction(this.logger,o.LOG_MAJOR,u,g),t!=="attaching"&&t!=="suspended"&&(this.retryCount=0),t==="attached"&&this.onAttached(),t==="attached"?this._attachResume=!0:(t==="detaching"||t==="failed")&&(this._attachResume=!1),this.state=t,this._allChannelChanges.emit(t,l),this.emit(t,l)}requestState(t,n){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.requestState","name = "+this.name+", state = "+t),this.notifyState(t,n),this.checkPendingState()}checkPendingState(){if(!this.connectionManager.state.sendEvents){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.checkPendingState","sendEvents is false; state is "+this.connectionManager.state.state);return}switch(o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.checkPendingState","name = "+this.name+", state = "+this.state),this.state){case"attaching":this.startStateTimerIfNotRunning(),this.attachImpl();break;case"detaching":this.startStateTimerIfNotRunning(),this.detachImpl();break;case"attached":this.sync();break;default:break}}timeoutPendingState(){switch(this.state){case"attaching":{let t=new w("Channel attach timed out",90007,408);this.notifyState("suspended",t);break}case"detaching":{let t=new w("Channel detach timed out",90007,408);this.notifyState("attached",t);break}default:this.checkPendingState();break}}startStateTimerIfNotRunning(){this.stateTimer||(this.stateTimer=setTimeout(()=>{o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.startStateTimerIfNotRunning","timer expired"),this.stateTimer=null,this.timeoutPendingState()},this.client.options.timeouts.realtimeRequestTimeout))}clearStateTimer(){let t=this.stateTimer;t&&(clearTimeout(t),this.stateTimer=null)}startRetryTimer(){if(this.retryTimer)return;this.retryCount++;let t=ln(this.client.options.timeouts.channelRetryTimeout,this.retryCount);this.retryTimer=setTimeout(()=>{this.state==="suspended"&&this.connectionManager.state.sendEvents&&(this.retryTimer=null,o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel retry timer expired","attempting a new attach"),this.requestState("attaching"))},t)}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}getReleaseErr(){let t=this.state;return t==="initialized"||t==="detached"||t==="failed"?null:new w("Can only release a channel in a state where there is no possibility of further updates from the server being received (initialized, detached, or failed); was "+t,90001,400)}setChannelSerial(t){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.setChannelSerial()","Updating channel serial; serial = "+t+"; previous = "+this.properties.channelSerial),t&&(this.properties.channelSerial=t)}async status(){return this.client.rest.channelMixin.status(this)}};function as(e){let t=e||{},{agent:n}=t;return S(t,["agent"])}var In=ca,cs=class Es extends Li{constructor(t){var n,i;if(super(U.objectifyOptions(t,!1,"BaseRealtime",o.defaultLogger)),o.logAction(this.logger,o.LOG_MINOR,"Realtime()",""),typeof EdgeRuntime=="string")throw new w(`Ably.Realtime instance cannot be used in Vercel Edge runtime. If you are running Vercel Edge functions, please replace your "new Ably.Realtime()" with "new Ably.Rest()" and use Ably Rest API instead of the Realtime API. If you are server-rendering your application in the Vercel Edge runtime, please use the condition "if (typeof EdgeRuntime === 'string')" to prevent instantiating Ably.Realtime instance during SSR in the Vercel Edge runtime.`,4e4,400);this._additionalTransportImplementations=Es.transportImplementationsFromPlugins(this.options.plugins),this._RealtimePresence=(i=(n=this.options.plugins)==null?void 0:n.RealtimePresence)!=null?i:null,this.connection=new ra(this,this.options),this._channels=new ha(this),this.options.autoConnect!==!1&&this.connect()}static transportImplementationsFromPlugins(t){let n={};return t?.WebSocketTransport&&(n[be.WebSocket]=t.WebSocketTransport),t?.XHRPolling&&(n[be.XhrPolling]=t.XHRPolling),n}get channels(){return this._channels}connect(){o.logAction(this.logger,o.LOG_MINOR,"Realtime.connect()",""),this.connection.connect()}close(){o.logAction(this.logger,o.LOG_MINOR,"Realtime.close()",""),this.connection.close()}};cs.EventEmitter=pe;var la=cs,ha=class extends pe{constructor(e){super(e.logger),this.realtime=e,this.all=Object.create(null),e.connection.connectionManager.on("transport.active",()=>{this.onTransportActive()})}channelSerials(){let e={};for(let t of Ke(this.all,!0)){let n=this.all[t];n.properties.channelSerial&&(e[t]=n.properties.channelSerial)}return e}recoverChannels(e){for(let t of Ke(e,!0)){let n=this.get(t);n.properties.channelSerial=e[t]}}async processChannelMessage(e){let t=e.channel;if(t===void 0){o.logAction(this.logger,o.LOG_ERROR,"Channels.processChannelMessage()","received event unspecified channel, action = "+e.action);return}let n=this.all[t];if(!n){o.logAction(this.logger,o.LOG_ERROR,"Channels.processChannelMessage()","received event for non-existent channel: "+t);return}await n.processMessage(e)}onTransportActive(){for(let e in this.all){let t=this.all[e];t.state==="attaching"||t.state==="detaching"?t.checkPendingState():t.state==="suspended"?t._attach(!1,null):t.state==="attached"&&t.requestState("attaching")}}propogateConnectionInterruption(e,t){let n={closing:"detached",closed:"detached",failed:"failed",suspended:"suspended"},i=["attaching","attached","detaching","suspended"],s=n[e];for(let r in this.all){let l=this.all[r];i.includes(l.state)&&l.notifyState(s,t)}}get(e,t){e=String(e);let n=this.all[e];if(!n)n=this.all[e]=new In(this.realtime,e,t);else if(t){if(n._shouldReattachToSetOptions(t,n.channelOptions))throw new w("Channels.get() cannot be used to set channel options that would cause the channel to reattach. Please, use RealtimeChannel.setOptions() instead.",4e4,400);n.setOptions(t)}return n}getDerived(e,t,n){if(t.filter){let i=Ut(t.filter),s=vi(e);e=`[filter=${i}${s.qualifierParam}]${s.channelName}`}return this.get(e,n)}release(e){e=String(e);let t=this.all[e];if(!t)return;let n=t.getReleaseErr();if(n)throw n;delete this.all[e]}},ua=la;function da(e,t){if(e.isSynthesized()||t.isSynthesized())return e.timestamp>=t.timestamp;let n=e.parseId(),i=t.parseId();return n.msgSerial===i.msgSerial?n.index>i.index:n.msgSerial>i.msgSerial}var En=class extends pe{constructor(e,t,n=da){super(e.logger),this.presence=e,this.map=Object.create(null),this.syncInProgress=!1,this.residualMembers=null,this.memberKey=t,this.newerThan=n}get(e){return this.map[e]}getClient(e){let t=this.map,n=[];for(let i in t){let s=t[i];s.clientId==e&&s.action!="absent"&&n.push(s)}return n}list(e){let t=this.map,n=e&&e.clientId,i=e&&e.connectionId,s=[];for(let r in t){let l=t[r];l.action!=="absent"&&(n&&n!=l.clientId||i&&i!=l.connectionId||s.push(l))}return s}put(e){(e.action==="enter"||e.action==="update")&&(e=Ne(e),e.action="present");let t=this.map,n=this.memberKey(e);this.residualMembers&&delete this.residualMembers[n];let i=t[n];return i&&!this.newerThan(e,i)?!1:(t[n]=e,!0)}values(){let e=this.map,t=[];for(let n in e){let i=e[n];i.action!="absent"&&t.push(i)}return t}remove(e){let t=this.map,n=this.memberKey(e),i=t[n];return i&&!this.newerThan(e,i)?!1:(this.syncInProgress?(e=Ne(e),e.action="absent",t[n]=e):delete t[n],!!i)}startSync(){let e=this.map,t=this.syncInProgress;o.logAction(this.logger,o.LOG_MINOR,"PresenceMap.startSync()","channel = "+this.presence.channel.name+"; syncInProgress = "+t),this.syncInProgress||(this.residualMembers=ue(e),this.setInProgress(!0))}endSync(){let e=this.map,t=this.syncInProgress;if(o.logAction(this.logger,o.LOG_MINOR,"PresenceMap.endSync()","channel = "+this.presence.channel.name+"; syncInProgress = "+t),t){for(let n in e)e[n].action==="absent"&&delete e[n];this.presence._synthesizeLeaves(D(this.residualMembers));for(let n in this.residualMembers)delete e[n];this.residualMembers=null,this.setInProgress(!1)}this.emit("sync")}waitSync(e){let t=this.syncInProgress;if(o.logAction(this.logger,o.LOG_MINOR,"PresenceMap.waitSync()","channel = "+this.presence.channel.name+"; syncInProgress = "+t),!t){e();return}this.once("sync",e)}clear(){this.map={},this.setInProgress(!1),this.residualMembers=null}setInProgress(e){o.logAction(this.logger,o.LOG_MICRO,"PresenceMap.setInProgress()","inProgress = "+e),this.syncInProgress=e,this.presence.syncComplete=!e}};function fa(e){return e.channel.client.auth.clientId}function Pn(e){let t=e.channel.client,n=t.auth.clientId;return(!n||n==="*")&&t.connection.state==="connected"}function pa(e,t,n){switch(e.state){case"attached":case"suspended":n();break;case"initialized":case"detached":case"detaching":case"attaching":_e(e.attach(),function(i){i?t(i):n()});break;default:t(w.fromValues(e.invalidStateError()))}}var ga=class extends pe{constructor(e){super(e.logger),this.channel=e,this.syncComplete=!1,this.members=new En(this,t=>t.clientId+":"+t.connectionId),this._myMembers=new En(this,t=>t.clientId),this.subscriptions=new pe(this.logger),this.pendingPresence=[]}async enter(e){if(Pn(this))throw new w("clientId must be specified to enter a presence channel",40012,400);return this._enterOrUpdateClient(void 0,void 0,e,"enter")}async update(e){if(Pn(this))throw new w("clientId must be specified to update presence data",40012,400);return this._enterOrUpdateClient(void 0,void 0,e,"update")}async enterClient(e,t){return this._enterOrUpdateClient(void 0,e,t,"enter")}async updateClient(e,t){return this._enterOrUpdateClient(void 0,e,t,"update")}async _enterOrUpdateClient(e,t,n,i){let s=this.channel;if(!s.connectionManager.activeState())throw s.connectionManager.getError();o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence."+i+"Client()","channel = "+s.name+", id = "+e+", client = "+(t||"(implicit) "+fa(this)));let r=zi(n);switch(r.action=i,e&&(r.id=e),t&&(r.clientId=t),await yn(r,s.channelOptions),s.state){case"attached":return new Promise((l,u)=>{s.sendPresence(r,g=>g?u(g):l())});case"initialized":case"detached":s.attach();case"attaching":return new Promise((l,u)=>{this.pendingPresence.push({presence:r,callback:g=>g?u(g):l()})});default:{let l=new ce("Unable to "+i+" presence channel while in "+s.state+" state",90001);throw l.code=90001,l}}}async leave(e){if(Pn(this))throw new w("clientId must have been specified to enter or leave a presence channel",40012,400);return this.leaveClient(void 0,e)}async leaveClient(e,t){let n=this.channel;if(!n.connectionManager.activeState())throw n.connectionManager.getError();o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.leaveClient()","leaving; channel = "+this.channel.name+", client = "+e);let i=zi(t);return i.action="leave",e&&(i.clientId=e),new Promise((s,r)=>{switch(n.state){case"attached":n.sendPresence(i,l=>l?r(l):s());break;case"attaching":this.pendingPresence.push({presence:i,callback:l=>l?r(l):s()});break;case"initialized":case"failed":{let l=new ce("Unable to leave presence channel (incompatible state)",90001);r(l);break}default:r(n.invalidStateError())}})}async get(e){let t=!e||("waitForSync"in e?e.waitForSync:!0);return new Promise((n,i)=>{function s(r){n(e?r.list(e):r.values())}if(this.channel.state==="suspended"){t?i(w.fromValues({statusCode:400,code:91005,message:"Presence state is out of sync due to channel being in the SUSPENDED state"})):s(this.members);return}pa(this.channel,r=>i(r),()=>{let r=this.members;t?r.waitSync(function(){s(r)}):s(r)})})}async history(e){o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.history()","channel = "+this.name);let t=this.channel.client.rest.presenceMixin;if(e&&e.untilAttach)if(this.channel.state==="attached")delete e.untilAttach,e.from_serial=this.channel.properties.attachSerial;else throw new w("option untilAttach requires the channel to be attached, was: "+this.channel.state,4e4,400);return t.history(this,e)}setPresence(e,t,n){o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.setPresence()","received presence for "+e.length+" participants; syncChannelSerial = "+n);let i,s,r=this.members,l=this._myMembers,u=[],g=this.channel.connectionManager.connectionId;t&&(this.members.startSync(),n&&(s=n.match(/^[\w-]+:(.*)$/))&&(i=s[1]));for(let f=0;f<e.length;f++){let b=Ne(e[f]);switch(b.action){case"leave":r.remove(b)&&u.push(b),b.connectionId===g&&!b.isSynthesized()&&l.remove(b);break;case"enter":case"present":case"update":r.put(b)&&u.push(b),b.connectionId===g&&l.put(b);break}}t&&!i&&(r.endSync(),this.channel.syncChannelSerial=null);for(let f=0;f<u.length;f++){let b=u[f];this.subscriptions.emit(b.action,b)}}onAttached(e){o.logAction(this.logger,o.LOG_MINOR,"RealtimePresence.onAttached()","channel = "+this.channel.name+", hasPresence = "+e),e?this.members.startSync():(this._synthesizeLeaves(this.members.values()),this.members.clear()),this._ensureMyMembersPresent();let t=this.pendingPresence,n=t.length;if(n){this.pendingPresence=[];let i=[],s=dn.create(this.logger);o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.onAttached","sending "+n+" queued presence messages");for(let r=0;r<n;r++){let l=t[r];i.push(l.presence),s.push(l.callback)}this.channel.sendPresence(i,s)}}actOnChannelState(e,t,n){switch(e){case"attached":this.onAttached(t);break;case"detached":case"failed":this._clearMyMembers(),this.members.clear();case"suspended":this.failPendingPresence(n);break}}failPendingPresence(e){if(this.pendingPresence.length){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.failPendingPresence","channel; name = "+this.channel.name+", err = "+J(e));for(let t=0;t<this.pendingPresence.length;t++)try{this.pendingPresence[t].callback(e)}catch{}this.pendingPresence=[]}}_clearMyMembers(){this._myMembers.clear()}_ensureMyMembersPresent(){let e=this._myMembers,t=this.channel.connectionManager.connectionId;for(let n in e.map){let i=e.map[n];o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence._ensureMyMembersPresent()",'Auto-reentering clientId "'+i.clientId+'" into the presence set');let s=i.connectionId===t?i.id:void 0;this._enterOrUpdateClient(s,i.clientId,i.data,"enter").catch(r=>{let l=new w("Presence auto re-enter failed",91004,400,r);o.logAction(this.logger,o.LOG_ERROR,"RealtimePresence._ensureMyMembersPresent()","Presence auto re-enter failed; reason = "+J(r));let u=new xn(this.channel.state,this.channel.state,!0,!1,l);this.channel.emit("update",u)})}}_synthesizeLeaves(e){let t=this.subscriptions;e.forEach(function(n){let i=Ne({action:"leave",connectionId:n.connectionId,clientId:n.clientId,data:n.data,encoding:n.encoding,timestamp:Date.now()});t.emit("leave",i)})}async subscribe(...e){let t=In.processListenerArgs(e),n=t[0],i=t[1],s=this.channel;if(s.state==="failed")throw w.fromValues(s.invalidStateError());this.subscriptions.on(n,i),await s.attach()}unsubscribe(...e){let t=In.processListenerArgs(e),n=t[0],i=t[1];this.subscriptions.off(n,i)}},ma=ga,ya=be.WebSocket;function va(e){return!!e.on}var _a=class extends tt{constructor(e,t,n){super(e,t,n),this.shortName=ya,n.heartbeats=m.Config.useProtocolHeartbeats,this.wsHost=n.host}static isAvailable(){return!!m.Config.WebSocket}createWebSocket(e,t){return this.uri=e+Se(t),new m.Config.WebSocket(this.uri)}toString(){return"WebSocketTransport; uri="+this.uri}connect(){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.connect()","starting"),tt.prototype.connect.call(this);let e=this,t=this.params,n=t.options,s=(n.tls?"wss://":"ws://")+this.wsHost+":"+U.getPort(n)+"/";o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.connect()","uri: "+s),_e(this.auth.getAuthParams(),function(r,l){if(e.isDisposed)return;let u="";for(let f in l)u+=" "+f+": "+l[f]+";";if(o.logAction(e.logger,o.LOG_MINOR,"WebSocketTransport.connect()","authParams:"+u+" err: "+r),r){e.disconnect(r);return}let g=t.getConnectParams(l);try{let f=e.wsConnection=e.createWebSocket(s,g);f.binaryType=m.Config.binaryType,f.onopen=function(){e.onWsOpen()},f.onclose=function(b){e.onWsClose(b)},f.onmessage=function(b){e.onWsData(b.data)},f.onerror=function(b){e.onWsError(b)},va(f)&&f.on("ping",function(){e.onActivity()})}catch(f){o.logAction(e.logger,o.LOG_ERROR,"WebSocketTransport.connect()","Unexpected exception creating websocket: err = "+(f.stack||f.message)),e.disconnect(f)}})}send(e){let t=this.wsConnection;if(!t){o.logAction(this.logger,o.LOG_ERROR,"WebSocketTransport.send()","No socket connection");return}try{t.send(Fo(e,this.connectionManager.realtime._MsgPack,this.params.format))}catch(n){let i="Exception from ws connection when trying to send: "+J(n);o.logAction(this.logger,o.LOG_ERROR,"WebSocketTransport.send()",i),this.finish("disconnected",new w(i,5e4,500))}}onWsData(e){o.logAction(this.logger,o.LOG_MICRO,"WebSocketTransport.onWsData()","data received; length = "+e.length+"; type = "+typeof e);try{this.onProtocolMessage(jo(e,this.connectionManager.realtime._MsgPack,this.connectionManager.realtime._RealtimePresence,this.format))}catch(t){o.logAction(this.logger,o.LOG_ERROR,"WebSocketTransport.onWsData()","Unexpected exception handing channel message: "+t.stack)}}onWsOpen(){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onWsOpen()","opened WebSocket"),this.emit("preconnect")}onWsClose(e){let t,n;if(typeof e=="object"?(n=e.code,t=e.wasClean||n===1e3):(n=e,t=n==1e3),delete this.wsConnection,t){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onWsClose()","Cleanly closed WebSocket");let i=new w("Websocket closed",80003,400);this.finish("disconnected",i)}else{let i="Unclean disconnection of WebSocket ; code = "+n,s=new w(i,80003,400);o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onWsClose()",i),this.finish("disconnected",s)}this.emit("disposed")}onWsError(e){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onError()","Error from WebSocket: "+e.message),m.Config.nextTick(()=>{this.disconnect(Error(e.message))})}dispose(){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.dispose()",""),this.isDisposed=!0;let e=this.wsConnection;e&&(e.onmessage=function(){},delete this.wsConnection,m.Config.nextTick(()=>{if(o.logAction(this.logger,o.LOG_MICRO,"WebSocketTransport.dispose()","closing websocket"),!e)throw new Error("WebSocketTransport.dispose(): wsConnection is not defined");e.close()}))}},ls=_a,ba=class{static subscribeFilter(e,t,n){let i=s=>{var r,l,u,g,f,b;let C={name:s.name,refTimeserial:(l=(r=s.extras)==null?void 0:r.ref)==null?void 0:l.timeserial,refType:(g=(u=s.extras)==null?void 0:u.ref)==null?void 0:g.type,isRef:!!((b=(f=s.extras)==null?void 0:f.ref)!=null&&b.timeserial),clientId:s.clientId};Object.entries(t).find(([O,R])=>R!==void 0?C[O]!==R:!1)||n(s)};this.addFilteredSubscription(e,t,n,i),e.subscriptions.on(i)}static addFilteredSubscription(e,t,n,i){var s;if(e.filteredSubscriptions||(e.filteredSubscriptions=new Map),e.filteredSubscriptions.has(n)){let r=e.filteredSubscriptions.get(n);r.set(t,((s=r?.get(t))==null?void 0:s.concat(i))||[i])}else e.filteredSubscriptions.set(n,new Map([[t,[i]]]))}static getAndDeleteFilteredSubscriptions(e,t,n){if(!e.filteredSubscriptions)return[];if(!n&&t)return Array.from(e.filteredSubscriptions.entries()).map(([r,l])=>{var u;let g=l.get(t);return l.delete(t),l.size===0&&((u=e.filteredSubscriptions)==null||u.delete(r)),g}).reduce((r,l)=>l?r.concat(...l):r,[]);if(!n||!e.filteredSubscriptions.has(n))return[];let i=e.filteredSubscriptions.get(n);if(!t){let r=Array.from(i.values()).reduce((l,u)=>l.concat(...u),[]);return e.filteredSubscriptions.delete(n),r}let s=i.get(t);return i.delete(t),s||[]}},xe=class $n extends ua{constructor(t){var n;let i=$n._MsgPack;if(!i)throw new Error("Expected DefaultRealtime._MsgPack to have been set");super(U.objectifyOptions(t,!0,"Realtime",o.defaultLogger,E(y({},Ji),{Crypto:(n=$n.Crypto)!=null?n:void 0,MsgPack:i,RealtimePresence:{RealtimePresence:ma,presenceMessageFromValues:Ne,presenceMessagesFromValuesArray:Wi,presenceMessageFromWireProtocol:Ht},WebSocketTransport:ls,MessageInteractions:ba})))}static get Crypto(){if(this._Crypto===null)throw new Error("Encryption not enabled; use ably.encryption.js instead");return this._Crypto}static set Crypto(t){this._Crypto=t}};xe.Utils=re,xe.ConnectionManager=rs,xe.ProtocolMessage=ts,xe._Crypto=null,xe.Message=Qi,xe.PresenceMessage=Xi,xe._MsgPack=null,xe._Http=gn,xe._PresenceMap=En;var Ln=xe,Un=Uint8Array,dt=Uint32Array,Nn=Math.pow,hs=new dt(8),us=[],ft=new dt(64);function ds(e){return(e-(e|0))*Nn(2,32)|0}for(var pt=2,gt=0;gt<64;){for(Bn=!0,Vt=2;Vt<=pt/2;Vt++)pt%Vt===0&&(Bn=!1);Bn&&(gt<8&&(hs[gt]=ds(Nn(pt,1/2))),us[gt]=ds(Nn(pt,1/3)),gt++),pt++}var Bn,Vt,wa=!!new Un(new dt([1]).buffer)[0];function Gn(e){return wa?e>>>24|(e>>>16&255)<<8|(e&65280)<<8|e<<24:e}function Ie(e,t){return e>>>t|e<<32-t}function qn(e){var t=hs.slice(),n=e.length,i=n*8,s=512-(i+64)%512-1+i+65,r=new Un(s/8),l=new dt(r.buffer);r.set(e,0),r[n]=128,l[l.length-1]=Gn(i);for(var u,g=0;g<s/32;g+=16){var f=t.slice();for(u=0;u<64;u++){var b;if(u<16)b=Gn(l[g+u]);else{var C=ft[u-15],O=ft[u-2];b=ft[u-7]+ft[u-16]+(Ie(C,7)^Ie(C,18)^C>>>3)+(Ie(O,17)^Ie(O,19)^O>>>10)}ft[u]=b|=0;for(var R=(Ie(f[4],6)^Ie(f[4],11)^Ie(f[4],25))+(f[4]&f[5]^~f[4]&f[6])+f[7]+b+us[u],I=(Ie(f[0],2)^Ie(f[0],13)^Ie(f[0],22))+(f[0]&f[1]^f[2]&(f[0]^f[1])),x=7;x>0;x--)f[x]=f[x-1];f[0]=R+I|0,f[4]=f[4]+R|0}for(u=0;u<8;u++)t[u]=t[u]+f[u]|0}return new Un(new dt(t.map(function(L){return Gn(L)})).buffer)}function Ca(e,t){if(e.length>64&&(e=qn(e)),e.length<64){let u=new Uint8Array(64);u.set(e,0),e=u}for(var n=new Uint8Array(64),i=new Uint8Array(64),s=0;s<64;s++)n[s]=54^e[s],i[s]=92^e[s];var r=new Uint8Array(t.length+64);r.set(n,0),r.set(t,64);var l=new Uint8Array(96);return l.set(i,0),l.set(qn(r),64),qn(l)}var Ra=class{constructor(){this.base64CharSet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.hexCharSet="0123456789abcdef"}uint8ViewToBase64(e){let t="",n=this.base64CharSet,i=e.byteLength,s=i%3,r=i-s,l,u,g,f,b;for(let C=0;C<r;C=C+3)b=e[C]<<16|e[C+1]<<8|e[C+2],l=(b&16515072)>>18,u=(b&258048)>>12,g=(b&4032)>>6,f=b&63,t+=n[l]+n[u]+n[g]+n[f];return s==1?(b=e[r],l=(b&252)>>2,u=(b&3)<<4,t+=n[l]+n[u]+"=="):s==2&&(b=e[r]<<8|e[r+1],l=(b&64512)>>10,u=(b&1008)>>4,g=(b&15)<<2,t+=n[l]+n[u]+n[g]+"="),t}base64ToArrayBuffer(e){let t=atob?.(e),n=t.length,i=new Uint8Array(n);for(let s=0;s<n;s++){let r=t.charCodeAt(s);i[s]=r}return this.toArrayBuffer(i)}isBuffer(e){return e instanceof ArrayBuffer||ArrayBuffer.isView(e)}toBuffer(e){if(!ArrayBuffer)throw new Error("Can't convert to Buffer: browser does not support the necessary types");if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(this.toArrayBuffer(e));throw new Error("BufferUtils.toBuffer expected an ArrayBuffer or a view onto one")}toArrayBuffer(e){if(!ArrayBuffer)throw new Error("Can't convert to ArrayBuffer: browser does not support the necessary types");if(e instanceof ArrayBuffer)return e;if(ArrayBuffer.isView(e))return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);throw new Error("BufferUtils.toArrayBuffer expected an ArrayBuffer or a view onto one")}base64Encode(e){return this.uint8ViewToBase64(this.toBuffer(e))}base64Decode(e){if(ArrayBuffer&&m.Config.atob)return this.base64ToArrayBuffer(e);throw new Error("Expected ArrayBuffer to exist and Platform.Config.atob to be configured")}hexEncode(e){return this.toBuffer(e).reduce((n,i)=>n+i.toString(16).padStart(2,"0"),"")}hexDecode(e){if(e.length%2!==0)throw new Error("Can't create a byte array from a hex string of odd length");let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=parseInt(e.slice(2*n,2*(n+1)),16);return this.toArrayBuffer(t)}utf8Encode(e){if(m.Config.TextEncoder){let t=new m.Config.TextEncoder().encode(e);return this.toArrayBuffer(t)}else throw new Error("Expected TextEncoder to be configured")}utf8Decode(e){if(!this.isBuffer(e))throw new Error("Expected input of utf8decode to be an arraybuffer or typed array");if(TextDecoder)return new TextDecoder().decode(e);throw new Error("Expected TextDecoder to be configured")}areBuffersEqual(e,t){if(!e||!t)return!1;let n=this.toArrayBuffer(e),i=this.toArrayBuffer(t);if(n.byteLength!=i.byteLength)return!1;let s=new Uint8Array(n),r=new Uint8Array(i);for(var l=0;l<s.length;l++)if(s[l]!=r[l])return!1;return!0}byteLength(e){return e instanceof ArrayBuffer||ArrayBuffer.isView(e)?e.byteLength:-1}arrayBufferViewToBuffer(e){return this.toArrayBuffer(e)}hmacSha256(e,t){let n=Ca(this.toBuffer(t),this.toBuffer(e));return this.toArrayBuffer(n)}},fs=new Ra,ka=function(e,t){var n="aes",i=256,s="cbc",r=16;function l(O){if(O.algorithm==="aes"&&O.mode==="cbc"){if(O.keyLength===128||O.keyLength===256)return;throw new Error("Unsupported key length "+O.keyLength+" for aes-cbc encryption. Encryption key must be 128 or 256 bits (16 or 32 ASCII characters)")}}function u(O){return O.replace("_","/").replace("-","+")}function g(O){return O instanceof f}class f{constructor(R,I,x,L){this.algorithm=R,this.keyLength=I,this.mode=x,this.key=L}}class b{static getDefaultParams(R){var I;if(!R.key)throw new Error("Crypto.getDefaultParams: a key is required");typeof R.key=="string"?I=t.toArrayBuffer(t.base64Decode(u(R.key))):R.key instanceof ArrayBuffer?I=R.key:I=t.toArrayBuffer(R.key);var x=R.algorithm||n,L=I.byteLength*8,j=R.mode||s,K=new f(x,L,j,I);if(R.keyLength&&R.keyLength!==K.keyLength)throw new Error("Crypto.getDefaultParams: a keyLength of "+R.keyLength+" was specified, but the key actually has length "+K.keyLength);return l(K),K}static async generateRandomKey(R){try{return e.getRandomArrayBuffer((R||i)/8)}catch(I){throw new w("Failed to generate random key: "+I.message,400,5e4,I)}}static getCipher(R,I){var x,L=g(R)?R:this.getDefaultParams(R);return{cipherParams:L,cipher:new C(L,(x=R.iv)!=null?x:null,I)}}}b.CipherParams=f;class C{constructor(R,I,x){if(this.logger=x,!crypto.subtle)throw isSecureContext?new Error("Crypto operations are not possible since the browser\u2019s SubtleCrypto class is unavailable (reason unknown)."):new Error("Crypto operations are is not possible since the current environment is a non-secure context and hence the browser\u2019s SubtleCrypto class is not available.");this.algorithm=R.algorithm+"-"+String(R.keyLength)+"-"+R.mode,this.webCryptoAlgorithm=R.algorithm+"-"+R.mode,this.key=t.toArrayBuffer(R.key),this.iv=I?t.toArrayBuffer(I):null}concat(R,I){let x=new ArrayBuffer(R.byteLength+I.byteLength),L=new DataView(x),j=new DataView(t.toArrayBuffer(R));for(let $=0;$<j.byteLength;$++)L.setInt8($,j.getInt8($));let K=new DataView(t.toArrayBuffer(I));for(let $=0;$<K.byteLength;$++)L.setInt8(j.byteLength+$,K.getInt8($));return x}async encrypt(R){o.logAction(this.logger,o.LOG_MICRO,"CBCCipher.encrypt()","");let I=await this.getIv(),x=await crypto.subtle.importKey("raw",this.key,this.webCryptoAlgorithm,!1,["encrypt"]),L=await crypto.subtle.encrypt({name:this.webCryptoAlgorithm,iv:I},x,R);return this.concat(I,L)}async decrypt(R){o.logAction(this.logger,o.LOG_MICRO,"CBCCipher.decrypt()","");let I=t.toArrayBuffer(R),x=I.slice(0,r),L=I.slice(r),j=await crypto.subtle.importKey("raw",this.key,this.webCryptoAlgorithm,!1,["decrypt"]);return crypto.subtle.decrypt({name:this.webCryptoAlgorithm,iv:x},j,L)}async getIv(){if(this.iv){var R=this.iv;return this.iv=null,R}let I=await e.getRandomArrayBuffer(r);return t.toArrayBuffer(I)}}return b},ps=(e=>(e[e.REQ_SEND=0]="REQ_SEND",e[e.REQ_RECV=1]="REQ_RECV",e[e.REQ_RECV_POLL=2]="REQ_RECV_POLL",e[e.REQ_RECV_STREAM=3]="REQ_RECV_STREAM",e))(ps||{}),Ge=ps;function gs(){return new w("No HTTP request plugin provided. Provide at least one of the FetchRequest or XHRRequest plugins.",400,4e4)}var mt,ms=(mt=class{constructor(e){this.checksInProgress=null,this.checkConnectivity=void 0,this.supportsAuthHeaders=!1,this.supportsLinkHeaders=!1;var t;this.client=e??null;let n=e?.options.connectivityCheckUrl||U.connectivityCheckUrl,i=(t=e?.options.connectivityCheckParams)!=null?t:null,s=!e?.options.connectivityCheckUrl,r=y(y({},ms.bundledRequestImplementations),e?._additionalHTTPRequestImplementations),l=r.XHRRequest,u=r.FetchRequest,g=!!(l||u);if(!g)throw gs();m.Config.xhrSupported&&l?(this.supportsAuthHeaders=!0,this.Request=async function(f,b,C,O,R){return new Promise(I=>{var x;let L=l.createRequest(b,C,O,R,Ge.REQ_SEND,(x=e&&e.options.timeouts)!=null?x:null,this.logger,f);L.once("complete",(j,K,$,B,Ce)=>I({error:j,body:K,headers:$,unpacked:B,statusCode:Ce})),L.exec()})},e?.options.disableConnectivityCheck?this.checkConnectivity=async function(){return!0}:this.checkConnectivity=async function(){var f;o.logAction(this.logger,o.LOG_MICRO,"(XHRRequest)Http.checkConnectivity()","Sending; "+n);let b=await this.doUri(Z.Get,n,null,null,i),C=!1;return s?C=!b.error&&((f=b.body)==null?void 0:f.replace(/\n/,""))=="yes":C=!b.error&&qr(b.statusCode),o.logAction(this.logger,o.LOG_MICRO,"(XHRRequest)Http.checkConnectivity()","Result: "+C),C}):m.Config.fetchSupported&&u?(this.supportsAuthHeaders=!0,this.Request=async(f,b,C,O,R)=>u(f,e??null,b,C,O,R),this.checkConnectivity=async function(){var f;o.logAction(this.logger,o.LOG_MICRO,"(Fetch)Http.checkConnectivity()","Sending; "+n);let b=await this.doUri(Z.Get,n,null,null,null),C=!b.error&&((f=b.body)==null?void 0:f.replace(/\n/,""))=="yes";return o.logAction(this.logger,o.LOG_MICRO,"(Fetch)Http.checkConnectivity()","Result: "+C),C}):this.Request=async()=>({error:g?new ce("no supported HTTP transports available",null,400):gs()})}get logger(){var e,t;return(t=(e=this.client)==null?void 0:e.logger)!=null?t:o.defaultLogger}async doUri(e,t,n,i,s){return this.Request?this.Request(e,t,n,s,i):{error:new ce("Request invoked before assigned to",null,500)}}shouldFallback(e){let t=e.statusCode;return t===408&&!e.code||t===400&&!e.code||t>=500&&t<=504}},mt.methods=[Z.Get,Z.Delete,Z.Post,Z.Put,Z.Patch],mt.methodsWithoutBody=[Z.Get,Z.Delete],mt.methodsWithBody=[Z.Post,Z.Put,Z.Patch],mt),ys=ms,nt="ablyjs-storage-test",it=typeof global<"u"?global:typeof window<"u"?window:self,Aa=class{constructor(){try{it.sessionStorage.setItem(nt,nt),it.sessionStorage.removeItem(nt),this.sessionSupported=!0}catch{this.sessionSupported=!1}try{it.localStorage.setItem(nt,nt),it.localStorage.removeItem(nt),this.localSupported=!0}catch{this.localSupported=!1}}get(e){return this._get(e,!1)}getSession(e){return this._get(e,!0)}remove(e){return this._remove(e,!1)}removeSession(e){return this._remove(e,!0)}set(e,t,n){return this._set(e,t,n,!1)}setSession(e,t,n){return this._set(e,t,n,!0)}_set(e,t,n,i){let s={value:t};return n&&(s.expires=Date.now()+n),this.storageInterface(i).setItem(e,JSON.stringify(s))}_get(e,t){if(t&&!this.sessionSupported)throw new Error("Session Storage not supported");if(!t&&!this.localSupported)throw new Error("Local Storage not supported");let n=this.storageInterface(t).getItem(e);if(!n)return null;let i=JSON.parse(n);return i.expires&&i.expires<Date.now()?(this.storageInterface(t).removeItem(e),null):i.value}_remove(e,t){return this.storageInterface(t).removeItem(e)}storageInterface(e){return e?it.sessionStorage:it.localStorage}},vs=new Aa,ee=hn(),Oa=typeof EdgeRuntime=="string";typeof Window>"u"&&typeof WorkerGlobalScope>"u"&&!Oa&&console.log("Warning: this distribution of Ably is intended for browsers. On nodejs, please use the 'ably' package on npm");function Sa(){let e=ee.location;return!ee.WebSocket||!e||!e.origin||e.origin.indexOf("http")>-1}function Ta(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}var Ma=ee.navigator&&ee.navigator.userAgent.toString(),xa=ee.location&&ee.location.href,Ia={agent:"browser",logTimestamps:!0,userAgent:Ma,currentUrl:xa,binaryType:"arraybuffer",WebSocket:ee.WebSocket,fetchSupported:!!ee.fetch,xhrSupported:ee.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest,allowComet:Sa(),useProtocolHeartbeats:!0,supportsBinary:!!ee.TextDecoder,preferBinary:!1,ArrayBuffer:ee.ArrayBuffer,atob:ee.atob,nextTick:typeof ee.setImmediate<"u"?ee.setImmediate.bind(ee):function(e){setTimeout(e,0)},addEventListener:ee.addEventListener,inspect:JSON.stringify,stringByteSize:function(e){return ee.TextDecoder&&new ee.TextEncoder().encode(e).length||e.length},TextEncoder:ee.TextEncoder,TextDecoder:ee.TextDecoder,getRandomArrayBuffer:async function(e){let t=new Uint8Array(e);return ee.crypto.getRandomValues(t),t.buffer},isWebworker:Ta(),push:{platform:"browser",formFactor:"desktop",storage:vs}},_s=Ia;function Ea(e){let t=[80015,80017,80030];return e.code?Ue.isTokenErr(e)?!1:t.includes(e.code)?!0:e.code>=4e4&&e.code<5e4:!1}function Dn(e){return Ea(e)?[Me({action:q.ERROR,error:e})]:[Me({action:q.DISCONNECTED,error:e})]}var Pa=class extends tt{constructor(e,t,n){super(e,t,n,!0),this.onAuthUpdated=i=>{this.authParams={access_token:i.token}},this.stream="stream"in n?n.stream:!0,this.sendRequest=null,this.recvRequest=null,this.pendingCallback=null,this.pendingItems=null}connect(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.connect()","starting"),tt.prototype.connect.call(this);let e=this.params,t=e.options,n=U.getHost(t,e.host),i=U.getPort(t),s=t.tls?"https://":"http://";this.baseUri=s+n+":"+i+"/comet/";let r=this.baseUri+"connect";o.logAction(this.logger,o.LOG_MINOR,"CometTransport.connect()","uri: "+r),_e(this.auth.getAuthParams(),(l,u)=>{if(l){this.disconnect(l);return}if(this.isDisposed)return;this.authParams=u;let g=this.params.getConnectParams(u);"stream"in g&&(this.stream=g.stream),o.logAction(this.logger,o.LOG_MINOR,"CometTransport.connect()","connectParams:"+Se(g));let f=!1,b=this.recvRequest=this.createRequest(r,null,g,null,this.stream?Ge.REQ_RECV_STREAM:Ge.REQ_RECV);b.on("data",C=>{this.recvRequest&&(f||(f=!0,this.emit("preconnect")),this.onData(C))}),b.on("complete",C=>{if(this.recvRequest||(C=C||new w("Request cancelled",80003,400)),this.recvRequest=null,!f&&!C&&(f=!0,this.emit("preconnect")),this.onActivity(),C){C.code?this.onData(Dn(C)):this.disconnect(C);return}m.Config.nextTick(()=>{this.recv()})}),b.exec()})}requestClose(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.requestClose()"),this._requestCloseOrDisconnect(!0)}requestDisconnect(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.requestDisconnect()"),this._requestCloseOrDisconnect(!1)}_requestCloseOrDisconnect(e){let t=e?this.closeUri:this.disconnectUri;if(t){let n=this.createRequest(t,null,this.authParams,null,Ge.REQ_SEND);n.on("complete",i=>{i&&(o.logAction(this.logger,o.LOG_ERROR,"CometTransport.request"+(e?"Close()":"Disconnect()"),"request returned err = "+J(i)),this.finish("disconnected",i))}),n.exec()}}dispose(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.dispose()",""),this.isDisposed||(this.isDisposed=!0,this.recvRequest&&(o.logAction(this.logger,o.LOG_MINOR,"CometTransport.dispose()","aborting recv request"),this.recvRequest.abort(),this.recvRequest=null),this.finish("disconnected",He.disconnected()),m.Config.nextTick(()=>{this.emit("disposed")}))}onConnect(e){var t;if(this.isDisposed)return;let n=(t=e.connectionDetails)==null?void 0:t.connectionKey;tt.prototype.onConnect.call(this,e);let i=this.baseUri+n;o.logAction(this.logger,o.LOG_MICRO,"CometTransport.onConnect()","baseUri = "+i),this.sendUri=i+"/send",this.recvUri=i+"/recv",this.closeUri=i+"/close",this.disconnectUri=i+"/disconnect"}send(e){if(this.sendRequest){this.pendingItems=this.pendingItems||[],this.pendingItems.push(e);return}let t=this.pendingItems||[];t.push(e),this.pendingItems=null,this.sendItems(t)}sendAnyPending(){let e=this.pendingItems;e&&(this.pendingItems=null,this.sendItems(e))}sendItems(e){let t=this.sendRequest=this.createRequest(this.sendUri,null,this.authParams,this.encodeRequest(e),Ge.REQ_SEND);t.on("complete",(n,i)=>{if(n&&o.logAction(this.logger,o.LOG_ERROR,"CometTransport.sendItems()","on complete: err = "+J(n)),this.sendRequest=null,n){n.code?this.onData(Dn(n)):this.disconnect(n);return}i&&this.onData(i),this.pendingItems&&m.Config.nextTick(()=>{this.sendRequest||this.sendAnyPending()})}),t.exec()}recv(){if(this.recvRequest||!this.isConnected)return;let e=this.recvRequest=this.createRequest(this.recvUri,null,this.authParams,null,this.stream?Ge.REQ_RECV_STREAM:Ge.REQ_RECV_POLL);e.on("data",t=>{this.onData(t)}),e.on("complete",t=>{if(this.recvRequest=null,this.onActivity(),t){t.code?this.onData(Dn(t)):this.disconnect(t);return}m.Config.nextTick(()=>{this.recv()})}),e.exec()}onData(e){try{let t=this.decodeResponse(e);if(t&&t.length)for(let n=0;n<t.length;n++)this.onProtocolMessage(kn(t[n],this.connectionManager.realtime._RealtimePresence))}catch(t){o.logAction(this.logger,o.LOG_ERROR,"CometTransport.onData()","Unexpected exception handing channel event: "+t.stack)}}encodeRequest(e){return JSON.stringify(e)}decodeResponse(e){return typeof e=="string"?JSON.parse(e):e}},La=Pa;function Ua(e,t){return cn(Ke(t)).includes("x-ably-errorcode")}function Na(e,t){if(Ua(e,t))return e.error&&w.fromValues(e.error)}var Ba=function(){},Ga=0,bs={};function qa(e,t){return e.getResponseHeader&&e.getResponseHeader(t)}function Da(e){return e.getResponseHeader&&(e.getResponseHeader("transfer-encoding")||!e.getResponseHeader("content-length"))}function Ha(e){let t=e.getAllResponseHeaders().trim().split(`\r
8
- `),n={};for(let i=0;i<t.length;i++){let s=t[i].split(":").map(r=>r.trim());n[s[0].toLowerCase()]=s[1]}return n}var Fa=class Ps extends pe{constructor(t,n,i,s,r,l,u,g){super(u),i=i||{},i.rnd=Lt(),this.uri=t+Se(i),this.headers=n||{},this.body=s,this.method=g?g.toUpperCase():ye(s)?"GET":"POST",this.requestMode=r,this.timeouts=l,this.timedOut=!1,this.requestComplete=!1,this.id=String(++Ga),bs[this.id]=this}static createRequest(t,n,i,s,r,l,u,g){let f=l||U.TIMEOUTS;return new Ps(t,n,ue(i),s,r,f,u,g)}complete(t,n,i,s,r){this.requestComplete||(this.requestComplete=!0,!t&&n&&this.emit("data",n),this.emit("complete",t,n,i,s,r),this.dispose())}abort(){this.dispose()}exec(){let t=this.headers,n=this.requestMode==Ge.REQ_SEND?this.timeouts.httpRequestTimeout:this.timeouts.recvTimeout,i=this.timer=setTimeout(()=>{this.timedOut=!0,r.abort()},n),s=this.method,r=this.xhr=new XMLHttpRequest,l=t.accept,u=this.body,g="text";l?l.indexOf("application/x-msgpack")===0&&(g="arraybuffer"):t.accept="application/json",u&&(t["content-type"]||(t["content-type"]="application/json")).indexOf("application/json")>-1&&typeof u!="string"&&(u=JSON.stringify(u)),r.open(s,this.uri,!0),r.responseType=g,"authorization"in t&&(r.withCredentials=!0);for(let B in t)r.setRequestHeader(B,t[B]);let f=(B,Ce,ge,bt)=>{var st;let Vn=Ce+" (event type: "+B.type+")";(st=this==null?void 0:this.xhr)!=null&&st.statusText&&(Vn+=", current statusText is "+this.xhr.statusText),o.logAction(this.logger,o.LOG_ERROR,"Request.on"+B.type+"()",Vn),this.complete(new ce(Vn,ge,bt))};r.onerror=function(B){f(B,"XHR error occurred",null,400)},r.onabort=B=>{this.timedOut?f(B,"Request aborted due to request timeout expiring",null,408):f(B,"Request cancelled",null,400)},r.ontimeout=function(B){f(B,"Request timed out",null,408)};let b,C,O,R=0,I=!1,x=()=>{if(clearTimeout(i),O=C<400,C==204){this.complete(null,null,null,null,C);return}b=this.requestMode==Ge.REQ_RECV_STREAM&&O&&Da(r)},L=()=>{let B;try{let ge=qa(r,"content-type");if(ge?ge.indexOf("application/json")>=0:r.responseType=="text"){let st=r.responseType==="arraybuffer"?m.BufferUtils.utf8Decode(r.response):String(r.responseText);st.length?B=JSON.parse(st):B=st,I=!0}else B=r.response;B.response!==void 0?(C=B.statusCode,O=C<400,t=B.headers,B=B.response):t=Ha(r)}catch(ge){this.complete(new ce("Malformed response body from server: "+ge.message,null,400));return}if(O||Array.isArray(B)){this.complete(null,B,t,I,C);return}let Ce=Na(B,t);Ce||(Ce=new ce("Error response received from server: "+C+" body was: "+m.Config.inspect(B),null,C)),this.complete(Ce,B,t,I,C)};function j(){let B=r.responseText,Ce=B.length-1,ge,bt;for(;R<Ce&&(ge=B.indexOf(`
9
- `,R))>-1;)bt=B.slice(R,ge),R=ge+1,K(bt)}let K=B=>{try{B=JSON.parse(B)}catch(Ce){this.complete(new ce("Malformed response body from server: "+Ce.message,null,400));return}this.emit("data",B)},$=()=>{j(),this.streamComplete=!0,m.Config.nextTick(()=>{this.complete()})};r.onreadystatechange=function(){let B=r.readyState;B<3||r.status!==0&&(C===void 0&&(C=r.status,x()),B==3&&b?j():B==4&&(b?$():L()))},r.send(u)}dispose(){let t=this.xhr;if(t){t.onreadystatechange=t.onerror=t.onabort=t.ontimeout=Ba,this.xhr=null;let n=this.timer;n&&(clearTimeout(n),this.timer=null),this.requestComplete||t.abort()}delete bs[this.id]}},ws=Fa,Cs=be.XhrPolling,ja=class extends La{constructor(e,t,n){super(e,t,n),this.shortName=Cs,n.stream=!1,this.shortName=Cs}static isAvailable(){return!!(m.Config.xhrSupported&&m.Config.allowComet)}toString(){return"XHRPollingTransport; uri="+this.baseUri+"; isConnected="+this.isConnected}createRequest(e,t,n,i,s){return ws.createRequest(e,t,n,i,s,this.timeouts,this.logger)}},Va=ja,Wa=["xhr_polling"],za={order:Wa,bundledImplementations:{web_socket:ls,xhr_polling:Va}},Ka=za,$a={connectivityCheckUrl:"https://internet-up.ably-realtime.com/is-the-internet-up.txt",wsConnectivityCheckUrl:"wss://ws-up.ably-realtime.com",defaultTransports:[be.XhrPolling,be.WebSocket]},Ja=$a;function Qa(e){if(e===void 0)return"undefined";let t,n;if(e instanceof ArrayBuffer?(n="ArrayBuffer",t=new DataView(e)):e instanceof DataView&&(n="DataView",t=e),!t)return JSON.stringify(e);let i=[];for(let s=0;s<e.byteLength;s++){if(s>20){i.push("...");break}let r=t.getUint8(s).toString(16);r.length===1&&(r="0"+r),i.push(r)}return"<"+n+" "+i.join(" ")+">"}function yt(e,t,n){for(let i=0,s=n.length;i<s;i++){let r=n.charCodeAt(i);if(r<128){e.setUint8(t++,r>>>0&127|0);continue}if(r<2048){e.setUint8(t++,r>>>6&31|192),e.setUint8(t++,r>>>0&63|128);continue}if(r<65536){e.setUint8(t++,r>>>12&15|224),e.setUint8(t++,r>>>6&63|128),e.setUint8(t++,r>>>0&63|128);continue}if(r<1114112){e.setUint8(t++,r>>>18&7|240),e.setUint8(t++,r>>>12&63|128),e.setUint8(t++,r>>>6&63|128),e.setUint8(t++,r>>>0&63|128);continue}throw new Error("bad codepoint "+r)}}function Rs(e,t,n){let i="";for(let s=t,r=t+n;s<r;s++){let l=e.getUint8(s);if(!(l&128)){i+=String.fromCharCode(l);continue}if((l&224)===192){i+=String.fromCharCode((l&15)<<6|e.getUint8(++s)&63);continue}if((l&240)===224){i+=String.fromCharCode((l&15)<<12|(e.getUint8(++s)&63)<<6|(e.getUint8(++s)&63)<<0);continue}if((l&248)===240){i+=String.fromCharCode((l&7)<<18|(e.getUint8(++s)&63)<<12|(e.getUint8(++s)&63)<<6|(e.getUint8(++s)&63)<<0);continue}throw new Error("Invalid byte "+l.toString(16))}return i}function Hn(e){let t=0;for(let n=0,i=e.length;n<i;n++){let s=e.charCodeAt(n);if(s<128){t+=1;continue}if(s<2048){t+=2;continue}if(s<65536){t+=3;continue}if(s<1114112){t+=4;continue}throw new Error("bad codepoint "+s)}return t}function Xa(e,t){let n=_t(e,t);if(n===0)return;let i=new ArrayBuffer(n),s=new DataView(i);return vt(e,s,0,t),i}var Fn=65536*65536,ks=1/Fn;function Ya(e,t){return t=t||0,e.getInt32(t)*Fn+e.getUint32(t+4)}function Za(e,t){return t=t||0,e.getUint32(t)*Fn+e.getUint32(t+4)}function ec(e,t,n){n<9223372036854776e3?(e.setInt32(t,Math.floor(n*ks)),e.setInt32(t+4,n&-1)):(e.setUint32(t,2147483647),e.setUint32(t+4,2147483647))}function tc(e,t,n){n<18446744073709552e3?(e.setUint32(t,Math.floor(n*ks)),e.setInt32(t+4,n&-1)):(e.setUint32(t,4294967295),e.setUint32(t+4,4294967295))}var nc=class{constructor(e,t){this.map=n=>{let i={};for(let s=0;s<n;s++){let r=this.parse();i[r]=this.parse()}return i},this.bin=n=>{let i=new ArrayBuffer(n);return new Uint8Array(i).set(new Uint8Array(this.view.buffer,this.offset,n),0),this.offset+=n,i},this.buf=this.bin,this.str=n=>{let i=Rs(this.view,this.offset,n);return this.offset+=n,i},this.array=n=>{let i=new Array(n);for(let s=0;s<n;s++)i[s]=this.parse();return i},this.ext=n=>(this.offset+=n,{type:this.view.getInt8(this.offset),data:this.buf(n)}),this.parse=()=>{let n=this.view.getUint8(this.offset),i,s;if(!(n&128))return this.offset++,n;if((n&240)===128)return s=n&15,this.offset++,this.map(s);if((n&240)===144)return s=n&15,this.offset++,this.array(s);if((n&224)===160)return s=n&31,this.offset++,this.str(s);if((n&224)===224)return i=this.view.getInt8(this.offset),this.offset++,i;switch(n){case 192:return this.offset++,null;case 193:this.offset++;return;case 194:return this.offset++,!1;case 195:return this.offset++,!0;case 196:return s=this.view.getUint8(this.offset+1),this.offset+=2,this.bin(s);case 197:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.bin(s);case 198:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.bin(s);case 199:return s=this.view.getUint8(this.offset+1),this.offset+=2,this.ext(s);case 200:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.ext(s);case 201:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.ext(s);case 202:return i=this.view.getFloat32(this.offset+1),this.offset+=5,i;case 203:return i=this.view.getFloat64(this.offset+1),this.offset+=9,i;case 204:return i=this.view.getUint8(this.offset+1),this.offset+=2,i;case 205:return i=this.view.getUint16(this.offset+1),this.offset+=3,i;case 206:return i=this.view.getUint32(this.offset+1),this.offset+=5,i;case 207:return i=Za(this.view,this.offset+1),this.offset+=9,i;case 208:return i=this.view.getInt8(this.offset+1),this.offset+=2,i;case 209:return i=this.view.getInt16(this.offset+1),this.offset+=3,i;case 210:return i=this.view.getInt32(this.offset+1),this.offset+=5,i;case 211:return i=Ya(this.view,this.offset+1),this.offset+=9,i;case 212:return s=1,this.offset++,this.ext(s);case 213:return s=2,this.offset++,this.ext(s);case 214:return s=4,this.offset++,this.ext(s);case 215:return s=8,this.offset++,this.ext(s);case 216:return s=16,this.offset++,this.ext(s);case 217:return s=this.view.getUint8(this.offset+1),this.offset+=2,this.str(s);case 218:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.str(s);case 219:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.str(s);case 220:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.array(s);case 221:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.array(s);case 222:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.map(s);case 223:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.map(s)}throw new Error("Unknown type 0x"+n.toString(16))},this.offset=t||0,this.view=e}};function ic(e){let t=new DataView(e),n=new nc(t),i=n.parse();if(n.offset!==e.byteLength)throw new Error(e.byteLength-n.offset+" trailing bytes");return i}function As(e,t){return Object.keys(e).filter(function(n){let i=e[n],s=typeof i;return(!t||i!=null)&&(s!=="function"||!!i.toJSON)})}function vt(e,t,n,i){let s=typeof e;if(typeof e=="string"){let r=Hn(e);if(r<32)return t.setUint8(n,r|160),yt(t,n+1,e),1+r;if(r<256)return t.setUint8(n,217),t.setUint8(n+1,r),yt(t,n+2,e),2+r;if(r<65536)return t.setUint8(n,218),t.setUint16(n+1,r),yt(t,n+3,e),3+r;if(r<4294967296)return t.setUint8(n,219),t.setUint32(n+1,r),yt(t,n+5,e),5+r}if(ArrayBuffer.isView&&ArrayBuffer.isView(e)&&(e=e.buffer),e instanceof ArrayBuffer){let r=e.byteLength;if(r<256)return t.setUint8(n,196),t.setUint8(n+1,r),new Uint8Array(t.buffer).set(new Uint8Array(e),n+2),2+r;if(r<65536)return t.setUint8(n,197),t.setUint16(n+1,r),new Uint8Array(t.buffer).set(new Uint8Array(e),n+3),3+r;if(r<4294967296)return t.setUint8(n,198),t.setUint32(n+1,r),new Uint8Array(t.buffer).set(new Uint8Array(e),n+5),5+r}if(typeof e=="number"){if(Math.floor(e)!==e)return t.setUint8(n,203),t.setFloat64(n+1,e),9;if(e>=0){if(e<128)return t.setUint8(n,e),1;if(e<256)return t.setUint8(n,204),t.setUint8(n+1,e),2;if(e<65536)return t.setUint8(n,205),t.setUint16(n+1,e),3;if(e<4294967296)return t.setUint8(n,206),t.setUint32(n+1,e),5;if(e<18446744073709552e3)return t.setUint8(n,207),tc(t,n+1,e),9;throw new Error("Number too big 0x"+e.toString(16))}if(e>=-32)return t.setInt8(n,e),1;if(e>=-128)return t.setUint8(n,208),t.setInt8(n+1,e),2;if(e>=-32768)return t.setUint8(n,209),t.setInt16(n+1,e),3;if(e>=-2147483648)return t.setUint8(n,210),t.setInt32(n+1,e),5;if(e>=-9223372036854776e3)return t.setUint8(n,211),ec(t,n+1,e),9;throw new Error("Number too small -0x"+(-e).toString(16).substr(1))}if(s==="undefined")return i?0:(t.setUint8(n,212),t.setUint8(n+1,0),t.setUint8(n+2,0),3);if(e===null)return i?0:(t.setUint8(n,192),1);if(s==="boolean")return t.setUint8(n,e?195:194),1;if(typeof e.toJSON=="function")return vt(e.toJSON(),t,n,i);if(s==="object"){let r,l=0,u,g=Array.isArray(e);if(g?r=e.length:(u=As(e,i),r=u.length),r<16?(t.setUint8(n,r|(g?144:128)),l=1):r<65536?(t.setUint8(n,g?220:222),t.setUint16(n+1,r),l=3):r<4294967296&&(t.setUint8(n,g?221:223),t.setUint32(n+1,r),l=5),g)for(let f=0;f<r;f++)l+=vt(e[f],t,n+l,i);else if(u)for(let f=0;f<r;f++){let b=u[f];l+=vt(b,t,n+l),l+=vt(e[b],t,n+l,i)}return l}if(s==="function")return 0;throw new Error("Unknown type "+s)}function _t(e,t){let n=typeof e;if(n==="string"){let i=Hn(e);if(i<32)return 1+i;if(i<256)return 2+i;if(i<65536)return 3+i;if(i<4294967296)return 5+i}if(ArrayBuffer.isView&&ArrayBuffer.isView(e)&&(e=e.buffer),e instanceof ArrayBuffer){let i=e.byteLength;if(i<256)return 2+i;if(i<65536)return 3+i;if(i<4294967296)return 5+i}if(typeof e=="number"){if(Math.floor(e)!==e)return 9;if(e>=0){if(e<128)return 1;if(e<256)return 2;if(e<65536)return 3;if(e<4294967296)return 5;if(e<18446744073709552e3)return 9;throw new Error("Number too big 0x"+e.toString(16))}if(e>=-32)return 1;if(e>=-128)return 2;if(e>=-32768)return 3;if(e>=-2147483648)return 5;if(e>=-9223372036854776e3)return 9;throw new Error("Number too small -0x"+e.toString(16).substr(1))}if(n==="boolean")return 1;if(e===null)return t?0:1;if(e===void 0)return t?0:3;if(typeof e.toJSON=="function")return _t(e.toJSON(),t);if(n==="object"){let i,s=0;if(Array.isArray(e)){i=e.length;for(let r=0;r<i;r++)s+=_t(e[r],t)}else{let r=As(e,t);i=r.length;for(let l=0;l<i;l++){let u=r[l];s+=_t(u)+_t(e[u],t)}}if(i<16)return 1+s;if(i<65536)return 3+s;if(i<4294967296)return 5+s;throw new Error("Array or object too long 0x"+i.toString(16))}if(n==="function")return 0;throw new Error("Unknown type "+n)}var jn={encode:Xa,decode:ic,inspect:Qa,utf8Write:yt,utf8Read:Rs,utf8ByteCount:Hn};function sc(e,t){return!!t.get("x-ably-errorcode")}function rc(e,t){if(sc(e,t))return e.error&&w.fromValues(e.error)}function oc(e){let t={};return e.forEach((n,i)=>{t[i]=n}),t}async function ac(e,t,n,i,s,r){let l=new Headers(i||{}),u=e?e.toUpperCase():ye(r)?"GET":"POST",g=new AbortController,f,b=new Promise(R=>{f=setTimeout(()=>{g.abort(),R({error:new ce("Request timed out",null,408)})},t?t.options.timeouts.httpRequestTimeout:U.TIMEOUTS.httpRequestTimeout)}),C={method:u,headers:l,body:r,signal:g.signal};m.Config.isWebworker||(C.credentials=l.has("authorization")?"include":"same-origin");let O=(async()=>{try{let R=new URLSearchParams(s||{});R.set("rnd",Lt());let I=n+"?"+R,x=await hn().fetch(I,C);if(clearTimeout(f),x.status==204)return{error:null,statusCode:x.status};let L=x.headers.get("Content-Type"),j;L&&L.indexOf("application/x-msgpack")>-1?j=await x.arrayBuffer():L&&L.indexOf("application/json")>-1?j=await x.json():j=await x.text();let K=!!L&&L.indexOf("application/x-msgpack")===-1,$=oc(x.headers);return x.ok?{error:null,body:j,headers:$,unpacked:K,statusCode:x.status}:{error:rc(j,x.headers)||new ce("Error response received from server: "+x.status+" body was: "+m.Config.inspect(j),null,x.status),body:j,headers:$,unpacked:K,statusCode:x.status}}catch(R){return clearTimeout(f),{error:R}}})();return Promise.race([b,O])}var cc={XHRRequest:ws,FetchRequest:ac},Os=ka(_s,fs);m.Crypto=Os,m.BufferUtils=fs,m.Http=ys,m.Config=_s,m.Transports=Ka,m.WebStorage=vs;for(let e of[Cn,Ln])e.Crypto=Os,e._MsgPack=jn;ys.bundledRequestImplementations=cc,o.initLogHandlers(),m.Defaults=Br(Ja),m.Config.agent&&(m.Defaults.agent+=" "+m.Config.agent);var lc={ErrorInfo:w,Rest:Cn,Realtime:Ln,msgpack:jn};if(typeof a.exports=="object"&&typeof c=="object"){var hc=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Object.getOwnPropertyNames(t))!Object.prototype.hasOwnProperty.call(e,s)&&s!==n&&Object.defineProperty(e,s,{get:()=>t[s],enumerable:!(i=Object.getOwnPropertyDescriptor(t,s))||i.enumerable});return e};a.exports=hc(a.exports,c)}return a.exports})});var Gc={};yc(Gc,{BaseportalChat:()=>St,default:()=>Bc});var zt=class{constructor(a,h){this.channelToken=a,this.baseUrl=`${h}/public/chat`}setVisitorIdentity(a,h){this.visitorEmail=a,this.visitorHash=h}clearVisitorIdentity(){this.visitorEmail=void 0,this.visitorHash=void 0}headers(){let a={"Content-Type":"application/json","x-channel-token":this.channelToken};return this.visitorEmail&&(a["x-visitor-email"]=this.visitorEmail),this.visitorHash&&(a["x-visitor-hash"]=this.visitorHash),a}async request(a,h,d){let p=await fetch(`${this.baseUrl}${h}`,{method:a,headers:this.headers(),body:d?JSON.stringify(d):void 0});if(!p.ok){let v=await p.text().catch(()=>"");throw new Error(`[BaseportalChat] API error ${p.status}: ${v}`)}return p.json()}async getChannelInfo(){return this.request("GET","/channel-info")}async initConversation(a){return this.request("POST","/conversations",{...a,channelToken:this.channelToken})}async getConversation(a){return this.request("GET",`/conversations/${a}`)}async getMessages(a,h){let d=new URLSearchParams;h?.limit&&d.set("limit",String(h.limit)),h?.page&&d.set("page",String(h.page));let p=d.toString()?`?${d.toString()}`:"";return this.request("GET",`/conversations/${a}/messages${p}`)}async uploadFile(a,h){let d=new FormData;d.append("file",h);let p={"x-channel-token":this.channelToken};this.visitorEmail&&(p["x-visitor-email"]=this.visitorEmail),this.visitorHash&&(p["x-visitor-hash"]=this.visitorHash);let v=await fetch(`${this.baseUrl}/conversations/${a}/upload`,{method:"POST",headers:p,body:d});if(!v.ok){let A=await v.text().catch(()=>"");throw new Error(`[BaseportalChat] Upload error ${v.status}: ${A}`)}return v.json()}async sendMessage(a,h){return this.request("POST",`/conversations/${a}/messages`,h)}async getVisitorConversations(){return this.request("GET","/conversations")}async reopenConversation(a){return this.request("POST",`/conversations/${a}/reopen`)}async getAblyToken(a){return this.request("POST","/ably-token",{conversationId:a})}};var Us=vc(Ls()),$t=class{constructor(a){this.client=null;this.channel=null;this.conversationId=null;this.handlers=null;this.apiClient=a}async subscribe(a,h){this.unsubscribe(),this.conversationId=a,this.handlers=h;try{let d=await this.apiClient.getAblyToken(a);this.client=new Us.Realtime({authCallback:(v,A)=>{A(null,d)},clientId:`visitor-${a}`});let p=`conversation-${a}`;this.channel=this.client.channels.get(p),this.channel.subscribe(v=>{if(v.data)try{let A=typeof v.data=="string"?JSON.parse(v.data):v.data;A.text==="conversation_status_updated"&&A.metadata?h.onConversationStatusUpdate(A.metadata):A.text==="created_or_updated_message"&&A.metadata&&h.onMessage(A.metadata)}catch(A){console.error("[BaseportalChat] Error parsing realtime message:",A)}})}catch(d){console.error("[BaseportalChat] Error connecting to realtime:",d)}}unsubscribe(){this.channel&&(this.channel.unsubscribe(),this.channel=null),this.client&&(this.client.close(),this.client=null),this.conversationId=null,this.handlers=null}isConnected(){return this.client?.connection.state==="connected"}};var bc={prechat:{title:"Iniciar conversa",description:"Preencha os dados abaixo para iniciar o atendimento.",name:"Nome",namePlaceholder:"Seu nome",email:"E-mail",emailPlaceholder:"seu@email.com",start:"Iniciar conversa",loading:"Iniciando...",privacyPrefix:"Ao enviar, voc\xEA concorda com nossa",privacyLink:"Pol\xEDtica de Privacidade"},chat:{placeholder:"Digite uma mensagem...",closed:"Esta conversa foi encerrada.",reopen:"Reabrir conversa",newConversation:"Nova conversa",attachFile:"Anexar arquivo",uploading:"Enviando...",fileTooLarge:"Arquivo muito grande (m\xE1x. 25MB)",download:"Baixar"},conversations:{title:"Atendimento",newConversation:"Nova conversa",empty:"Nenhuma conversa encontrada.",open:"Aberta",closed:"Fechada",noMessages:"Nenhuma mensagem ainda"}},wc={prechat:{title:"Start a conversation",description:"Fill in the details below to start chatting.",name:"Name",namePlaceholder:"Your name",email:"Email",emailPlaceholder:"you@email.com",start:"Start conversation",loading:"Starting...",privacyPrefix:"By sending, you agree to our",privacyLink:"Privacy Policy"},chat:{placeholder:"Type a message...",closed:"This conversation has been closed.",reopen:"Reopen conversation",newConversation:"New conversation",attachFile:"Attach file",uploading:"Uploading...",fileTooLarge:"File too large (max 25MB)",download:"Download"},conversations:{title:"Support",newConversation:"New conversation",empty:"No conversations found.",open:"Open",closed:"Closed",noMessages:"No messages yet"}},Cc={prechat:{title:"Iniciar conversaci\xF3n",description:"Complete los datos a continuaci\xF3n para iniciar la atenci\xF3n.",name:"Nombre",namePlaceholder:"Tu nombre",email:"Correo electr\xF3nico",emailPlaceholder:"tu@email.com",start:"Iniciar conversaci\xF3n",loading:"Iniciando...",privacyPrefix:"Al enviar, aceptas nuestra",privacyLink:"Pol\xEDtica de Privacidad"},chat:{placeholder:"Escribe un mensaje...",closed:"Esta conversaci\xF3n ha sido cerrada.",reopen:"Reabrir conversaci\xF3n",newConversation:"Nueva conversaci\xF3n",attachFile:"Adjuntar archivo",uploading:"Subiendo...",fileTooLarge:"Archivo demasiado grande (m\xE1x. 25MB)",download:"Descargar"},conversations:{title:"Atenci\xF3n",newConversation:"Nueva conversaci\xF3n",empty:"No se encontraron conversaciones.",open:"Abierta",closed:"Cerrada",noMessages:"Sin mensajes a\xFAn"}},Ns={pt:bc,en:wc,es:Cc};function Bs(c){return Ns[c]||Ns.pt}var Zt,V,Fs,Rc,$e,Gs,js,Qn,Zn,Xn,Yn,kc,kt={},Vs=[],Ac=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ei=Array.isArray;function Fe(c,a){for(var h in a)c[h]=a[h];return c}function Ws(c){c&&c.parentNode&&c.parentNode.removeChild(c)}function ti(c,a,h){var d,p,v,A={};for(v in a)v=="key"?d=a[v]:v=="ref"?p=a[v]:A[v]=a[v];if(arguments.length>2&&(A.children=arguments.length>3?Zt.call(arguments,2):h),typeof c=="function"&&c.defaultProps!=null)for(v in c.defaultProps)A[v]===void 0&&(A[v]=c.defaultProps[v]);return Qt(c,A,d,p,null)}function Qt(c,a,h,d,p){var v={type:c,props:a,key:h,ref:d,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:p??++Fs,__i:-1,__u:0};return p==null&&V.vnode!=null&&V.vnode(v),v}function Ae(c){return c.children}function Xt(c,a){this.props=c,this.context=a}function at(c,a){if(a==null)return c.__?at(c.__,c.__i+1):null;for(var h;a<c.__k.length;a++)if((h=c.__k[a])!=null&&h.__e!=null)return h.__e;return typeof c.type=="function"?at(c):null}function zs(c){var a,h;if((c=c.__)!=null&&c.__c!=null){for(c.__e=c.__c.base=null,a=0;a<c.__k.length;a++)if((h=c.__k[a])!=null&&h.__e!=null){c.__e=c.__c.base=h.__e;break}return zs(c)}}function qs(c){(!c.__d&&(c.__d=!0)&&$e.push(c)&&!Yt.__r++||Gs!==V.debounceRendering)&&((Gs=V.debounceRendering)||js)(Yt)}function Yt(){var c,a,h,d,p,v,A,T;for($e.sort(Qn);c=$e.shift();)c.__d&&(a=$e.length,d=void 0,v=(p=(h=c).__v).__e,A=[],T=[],h.__P&&((d=Fe({},p)).__v=p.__v+1,V.vnode&&V.vnode(d),ni(h.__P,d,p,h.__n,h.__P.namespaceURI,32&p.__u?[v]:null,A,v??at(p),!!(32&p.__u),T),d.__v=p.__v,d.__.__k[d.__i]=d,Js(A,d,T),d.__e!=v&&zs(d)),$e.length>a&&$e.sort(Qn));Yt.__r=0}function Ks(c,a,h,d,p,v,A,T,M,k,P){var y,E,S,H,ne,W=d&&d.__k||Vs,F=a.length;for(h.__d=M,Oc(h,a,W),M=h.__d,y=0;y<F;y++)(S=h.__k[y])!=null&&(E=S.__i===-1?kt:W[S.__i]||kt,S.__i=y,ni(c,S,E,p,v,A,T,M,k,P),H=S.__e,S.ref&&E.ref!=S.ref&&(E.ref&&ii(E.ref,null,S),P.push(S.ref,S.__c||H,S)),ne==null&&H!=null&&(ne=H),65536&S.__u||E.__k===S.__k?M=$s(S,M,c):typeof S.type=="function"&&S.__d!==void 0?M=S.__d:H&&(M=H.nextSibling),S.__d=void 0,S.__u&=-196609);h.__d=M,h.__e=ne}function Oc(c,a,h){var d,p,v,A,T,M=a.length,k=h.length,P=k,y=0;for(c.__k=[],d=0;d<M;d++)(p=a[d])!=null&&typeof p!="boolean"&&typeof p!="function"?(A=d+y,(p=c.__k[d]=typeof p=="string"||typeof p=="number"||typeof p=="bigint"||p.constructor==String?Qt(null,p,null,null,null):ei(p)?Qt(Ae,{children:p},null,null,null):p.constructor===void 0&&p.__b>0?Qt(p.type,p.props,p.key,p.ref?p.ref:null,p.__v):p).__=c,p.__b=c.__b+1,v=null,(T=p.__i=Sc(p,h,A,P))!==-1&&(P--,(v=h[T])&&(v.__u|=131072)),v==null||v.__v===null?(T==-1&&y--,typeof p.type!="function"&&(p.__u|=65536)):T!==A&&(T==A-1?y--:T==A+1?y++:(T>A?y--:y++,p.__u|=65536))):p=c.__k[d]=null;if(P)for(d=0;d<k;d++)(v=h[d])!=null&&!(131072&v.__u)&&(v.__e==c.__d&&(c.__d=at(v)),Qs(v,v))}function $s(c,a,h){var d,p;if(typeof c.type=="function"){for(d=c.__k,p=0;d&&p<d.length;p++)d[p]&&(d[p].__=c,a=$s(d[p],a,h));return a}c.__e!=a&&(a&&c.type&&!h.contains(a)&&(a=at(c)),h.insertBefore(c.__e,a||null),a=c.__e);do a=a&&a.nextSibling;while(a!=null&&a.nodeType===8);return a}function Sc(c,a,h,d){var p=c.key,v=c.type,A=h-1,T=h+1,M=a[h];if(M===null||M&&p==M.key&&v===M.type&&!(131072&M.__u))return h;if((typeof v!="function"||v===Ae||p)&&d>(M!=null&&!(131072&M.__u)?1:0))for(;A>=0||T<a.length;){if(A>=0){if((M=a[A])&&!(131072&M.__u)&&p==M.key&&v===M.type)return A;A--}if(T<a.length){if((M=a[T])&&!(131072&M.__u)&&p==M.key&&v===M.type)return T;T++}}return-1}function Ds(c,a,h){a[0]==="-"?c.setProperty(a,h??""):c[a]=h==null?"":typeof h!="number"||Ac.test(a)?h:h+"px"}function Jt(c,a,h,d,p){var v;e:if(a==="style")if(typeof h=="string")c.style.cssText=h;else{if(typeof d=="string"&&(c.style.cssText=d=""),d)for(a in d)h&&a in h||Ds(c.style,a,"");if(h)for(a in h)d&&h[a]===d[a]||Ds(c.style,a,h[a])}else if(a[0]==="o"&&a[1]==="n")v=a!==(a=a.replace(/(PointerCapture)$|Capture$/i,"$1")),a=a.toLowerCase()in c||a==="onFocusOut"||a==="onFocusIn"?a.toLowerCase().slice(2):a.slice(2),c.l||(c.l={}),c.l[a+v]=h,h?d?h.u=d.u:(h.u=Zn,c.addEventListener(a,v?Yn:Xn,v)):c.removeEventListener(a,v?Yn:Xn,v);else{if(p=="http://www.w3.org/2000/svg")a=a.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(a!="width"&&a!="height"&&a!="href"&&a!="list"&&a!="form"&&a!="tabIndex"&&a!="download"&&a!="rowSpan"&&a!="colSpan"&&a!="role"&&a!="popover"&&a in c)try{c[a]=h??"";break e}catch{}typeof h=="function"||(h==null||h===!1&&a[4]!=="-"?c.removeAttribute(a):c.setAttribute(a,a=="popover"&&h==1?"":h))}}function Hs(c){return function(a){if(this.l){var h=this.l[a.type+c];if(a.t==null)a.t=Zn++;else if(a.t<h.u)return;return V.event&&(a=V.event(a)),"handleEvent"in h?h.handleEvent(a):h(a)}}}function ni(c,a,h,d,p,v,A,T,M,k){var P,y,E,S,H,ne,W,F,m,z,Q,me,le,he,Ee,o,re=a.type;if(a.constructor!==void 0)return null;128&h.__u&&(M=!!(32&h.__u),v=[T=a.__e=h.__e]),(P=V.__b)&&P(a);e:if(typeof re=="function")try{if(F=a.props,m="prototype"in re&&re.prototype.render,z=(P=re.contextType)&&d[P.__c],Q=P?z?z.props.value:P.__:d,h.__c?W=(y=a.__c=h.__c).__=y.__E:(m?a.__c=y=new re(F,Q):(a.__c=y=new Xt(F,Q),y.constructor=re,y.render=Mc),z&&z.sub(y),y.props=F,y.state||(y.state={}),y.context=Q,y.__n=d,E=y.__d=!0,y.__h=[],y._sb=[]),m&&y.__s==null&&(y.__s=y.state),m&&re.getDerivedStateFromProps!=null&&(y.__s==y.state&&(y.__s=Fe({},y.__s)),Fe(y.__s,re.getDerivedStateFromProps(F,y.__s))),S=y.props,H=y.state,y.__v=a,E)m&&re.getDerivedStateFromProps==null&&y.componentWillMount!=null&&y.componentWillMount(),m&&y.componentDidMount!=null&&y.__h.push(y.componentDidMount);else{if(m&&re.getDerivedStateFromProps==null&&F!==S&&y.componentWillReceiveProps!=null&&y.componentWillReceiveProps(F,Q),!y.__e&&(y.shouldComponentUpdate!=null&&y.shouldComponentUpdate(F,y.__s,Q)===!1||a.__v===h.__v)){for(a.__v!==h.__v&&(y.props=F,y.state=y.__s,y.__d=!1),a.__e=h.__e,a.__k=h.__k,a.__k.some(function(Oe){Oe&&(Oe.__=a)}),me=0;me<y._sb.length;me++)y.__h.push(y._sb[me]);y._sb=[],y.__h.length&&A.push(y);break e}y.componentWillUpdate!=null&&y.componentWillUpdate(F,y.__s,Q),m&&y.componentDidUpdate!=null&&y.__h.push(function(){y.componentDidUpdate(S,H,ne)})}if(y.context=Q,y.props=F,y.__P=c,y.__e=!1,le=V.__r,he=0,m){for(y.state=y.__s,y.__d=!1,le&&le(a),P=y.render(y.props,y.state,y.context),Ee=0;Ee<y._sb.length;Ee++)y.__h.push(y._sb[Ee]);y._sb=[]}else do y.__d=!1,le&&le(a),P=y.render(y.props,y.state,y.context),y.state=y.__s;while(y.__d&&++he<25);y.state=y.__s,y.getChildContext!=null&&(d=Fe(Fe({},d),y.getChildContext())),m&&!E&&y.getSnapshotBeforeUpdate!=null&&(ne=y.getSnapshotBeforeUpdate(S,H)),Ks(c,ei(o=P!=null&&P.type===Ae&&P.key==null?P.props.children:P)?o:[o],a,h,d,p,v,A,T,M,k),y.base=a.__e,a.__u&=-161,y.__h.length&&A.push(y),W&&(y.__E=y.__=null)}catch(Oe){if(a.__v=null,M||v!=null){for(a.__u|=M?160:128;T&&T.nodeType===8&&T.nextSibling;)T=T.nextSibling;v[v.indexOf(T)]=null,a.__e=T}else a.__e=h.__e,a.__k=h.__k;V.__e(Oe,a,h)}else v==null&&a.__v===h.__v?(a.__k=h.__k,a.__e=h.__e):a.__e=Tc(h.__e,a,h,d,p,v,A,M,k);(P=V.diffed)&&P(a)}function Js(c,a,h){a.__d=void 0;for(var d=0;d<h.length;d++)ii(h[d],h[++d],h[++d]);V.__c&&V.__c(a,c),c.some(function(p){try{c=p.__h,p.__h=[],c.some(function(v){v.call(p)})}catch(v){V.__e(v,p.__v)}})}function Tc(c,a,h,d,p,v,A,T,M){var k,P,y,E,S,H,ne,W=h.props,F=a.props,m=a.type;if(m==="svg"?p="http://www.w3.org/2000/svg":m==="math"?p="http://www.w3.org/1998/Math/MathML":p||(p="http://www.w3.org/1999/xhtml"),v!=null){for(k=0;k<v.length;k++)if((S=v[k])&&"setAttribute"in S==!!m&&(m?S.localName===m:S.nodeType===3)){c=S,v[k]=null;break}}if(c==null){if(m===null)return document.createTextNode(F);c=document.createElementNS(p,m,F.is&&F),T&&(V.__m&&V.__m(a,v),T=!1),v=null}if(m===null)W===F||T&&c.data===F||(c.data=F);else{if(v=v&&Zt.call(c.childNodes),W=h.props||kt,!T&&v!=null)for(W={},k=0;k<c.attributes.length;k++)W[(S=c.attributes[k]).name]=S.value;for(k in W)if(S=W[k],k!="children"){if(k=="dangerouslySetInnerHTML")y=S;else if(!(k in F)){if(k=="value"&&"defaultValue"in F||k=="checked"&&"defaultChecked"in F)continue;Jt(c,k,null,S,p)}}for(k in F)S=F[k],k=="children"?E=S:k=="dangerouslySetInnerHTML"?P=S:k=="value"?H=S:k=="checked"?ne=S:T&&typeof S!="function"||W[k]===S||Jt(c,k,S,W[k],p);if(P)T||y&&(P.__html===y.__html||P.__html===c.innerHTML)||(c.innerHTML=P.__html),a.__k=[];else if(y&&(c.innerHTML=""),Ks(c,ei(E)?E:[E],a,h,d,m==="foreignObject"?"http://www.w3.org/1999/xhtml":p,v,A,v?v[0]:h.__k&&at(h,0),T,M),v!=null)for(k=v.length;k--;)Ws(v[k]);T||(k="value",m==="progress"&&H==null?c.removeAttribute("value"):H!==void 0&&(H!==c[k]||m==="progress"&&!H||m==="option"&&H!==W[k])&&Jt(c,k,H,W[k],p),k="checked",ne!==void 0&&ne!==c[k]&&Jt(c,k,ne,W[k],p))}return c}function ii(c,a,h){try{if(typeof c=="function"){var d=typeof c.__u=="function";d&&c.__u(),d&&a==null||(c.__u=c(a))}else c.current=a}catch(p){V.__e(p,h)}}function Qs(c,a,h){var d,p;if(V.unmount&&V.unmount(c),(d=c.ref)&&(d.current&&d.current!==c.__e||ii(d,null,a)),(d=c.__c)!=null){if(d.componentWillUnmount)try{d.componentWillUnmount()}catch(v){V.__e(v,a)}d.base=d.__P=null}if(d=c.__k)for(p=0;p<d.length;p++)d[p]&&Qs(d[p],a,h||typeof c.type!="function");h||Ws(c.__e),c.__c=c.__=c.__e=c.__d=void 0}function Mc(c,a,h){return this.constructor(c,h)}function si(c,a,h){var d,p,v,A;V.__&&V.__(c,a),p=(d=typeof h=="function")?null:h&&h.__k||a.__k,v=[],A=[],ni(a,c=(!d&&h||a).__k=ti(Ae,null,[c]),p||kt,kt,a.namespaceURI,!d&&h?[h]:p?null:a.firstChild?Zt.call(a.childNodes):null,v,!d&&h?h:p?p.__e:a.firstChild,d,A),Js(v,c,A)}Zt=Vs.slice,V={__e:function(c,a,h,d){for(var p,v,A;a=a.__;)if((p=a.__c)&&!p.__)try{if((v=p.constructor)&&v.getDerivedStateFromError!=null&&(p.setState(v.getDerivedStateFromError(c)),A=p.__d),p.componentDidCatch!=null&&(p.componentDidCatch(c,d||{}),A=p.__d),A)return p.__E=p}catch(T){c=T}throw c}},Fs=0,Rc=function(c){return c!=null&&c.constructor==null},Xt.prototype.setState=function(c,a){var h;h=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=Fe({},this.state),typeof c=="function"&&(c=c(Fe({},h),this.props)),c&&Fe(h,c),c!=null&&this.__v&&(a&&this._sb.push(a),qs(this))},Xt.prototype.forceUpdate=function(c){this.__v&&(this.__e=!0,c&&this.__h.push(c),qs(this))},Xt.prototype.render=Ae,$e=[],js=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Qn=function(c,a){return c.__v.__b-a.__v.__b},Yt.__r=0,Zn=0,Xn=Hs(!1),Yn=Hs(!0),kc=0;var At,te,ri,Xs,Ot=0,rr=[],ie=V,Ys=ie.__b,Zs=ie.__r,er=ie.diffed,tr=ie.__c,nr=ie.unmount,ir=ie.__;function ai(c,a){ie.__h&&ie.__h(te,c,Ot||a),Ot=0;var h=te.__H||(te.__H={__:[],__h:[]});return c>=h.__.length&&h.__.push({}),h.__[c]}function se(c){return Ot=1,xc(cr,c)}function xc(c,a,h){var d=ai(At++,2);if(d.t=c,!d.__c&&(d.__=[h?h(a):cr(void 0,a),function(T){var M=d.__N?d.__N[0]:d.__[0],k=d.t(M,T);M!==k&&(d.__N=[k,d.__[1]],d.__c.setState({}))}],d.__c=te,!te.u)){var p=function(T,M,k){if(!d.__c.__H)return!0;var P=d.__c.__H.__.filter(function(E){return!!E.__c});if(P.every(function(E){return!E.__N}))return!v||v.call(this,T,M,k);var y=d.__c.props!==T;return P.forEach(function(E){if(E.__N){var S=E.__[0];E.__=E.__N,E.__N=void 0,S!==E.__[0]&&(y=!0)}}),v&&v.call(this,T,M,k)||y};te.u=!0;var v=te.shouldComponentUpdate,A=te.componentWillUpdate;te.componentWillUpdate=function(T,M,k){if(this.__e){var P=v;v=void 0,p(T,M,k),v=P}A&&A.call(this,T,M,k)},te.shouldComponentUpdate=p}return d.__N||d.__}function je(c,a){var h=ai(At++,3);!ie.__s&&ar(h.__H,a)&&(h.__=c,h.i=a,te.__H.__h.push(h))}function Je(c){return Ot=5,or(function(){return{current:c}},[])}function or(c,a){var h=ai(At++,7);return ar(h.__H,a)&&(h.__=c(),h.__H=a,h.__h=c),h.__}function ae(c,a){return Ot=8,or(function(){return c},a)}function Ic(){for(var c;c=rr.shift();)if(c.__P&&c.__H)try{c.__H.__h.forEach(en),c.__H.__h.forEach(oi),c.__H.__h=[]}catch(a){c.__H.__h=[],ie.__e(a,c.__v)}}ie.__b=function(c){te=null,Ys&&Ys(c)},ie.__=function(c,a){c&&a.__k&&a.__k.__m&&(c.__m=a.__k.__m),ir&&ir(c,a)},ie.__r=function(c){Zs&&Zs(c),At=0;var a=(te=c.__c).__H;a&&(ri===te?(a.__h=[],te.__h=[],a.__.forEach(function(h){h.__N&&(h.__=h.__N),h.i=h.__N=void 0})):(a.__h.forEach(en),a.__h.forEach(oi),a.__h=[],At=0)),ri=te},ie.diffed=function(c){er&&er(c);var a=c.__c;a&&a.__H&&(a.__H.__h.length&&(rr.push(a)!==1&&Xs===ie.requestAnimationFrame||((Xs=ie.requestAnimationFrame)||Ec)(Ic)),a.__H.__.forEach(function(h){h.i&&(h.__H=h.i),h.i=void 0})),ri=te=null},ie.__c=function(c,a){a.some(function(h){try{h.__h.forEach(en),h.__h=h.__h.filter(function(d){return!d.__||oi(d)})}catch(d){a.some(function(p){p.__h&&(p.__h=[])}),a=[],ie.__e(d,h.__v)}}),tr&&tr(c,a)},ie.unmount=function(c){nr&&nr(c);var a,h=c.__c;h&&h.__H&&(h.__H.__.forEach(function(d){try{en(d)}catch(p){a=p}}),h.__H=void 0,a&&ie.__e(a,h.__v))};var sr=typeof requestAnimationFrame=="function";function Ec(c){var a,h=function(){clearTimeout(d),sr&&cancelAnimationFrame(a),setTimeout(c)},d=setTimeout(h,100);sr&&(a=requestAnimationFrame(h))}function en(c){var a=te,h=c.__c;typeof h=="function"&&(c.__c=void 0,h()),te=a}function oi(c){var a=te;c.__c=c.__(),te=a}function ar(c,a){return!c||c.length!==a.length||a.some(function(h,d){return h!==c[d]})}function cr(c,a){return typeof a=="function"?a(c):a}var Pc=0,Ul=Array.isArray;function _(c,a,h,d,p,v){a||(a={});var A,T,M=a;"ref"in a&&(A=a.ref,delete a.ref);var k={type:c,props:M,key:h,ref:A,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:--Pc,__i:-1,__u:0,__source:p,__self:v};if(typeof c=="function"&&(A=c.defaultProps))for(T in A)M[T]===void 0&&(M[T]=A[T]);return V.vnode&&V.vnode(k),k}var lr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:_("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}),Ve=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),_("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]}),hr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"19",y1:"12",x2:"5",y2:"12"}),_("polyline",{points:"12 19 5 12 12 5"})]}),ur=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),_("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]}),dr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),_("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),fr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:_("path",{d:"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"})}),pr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),_("polyline",{points:"7 10 12 15 17 10"}),_("line",{x1:"12",y1:"15",x2:"12",y2:"3"})]}),tn=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),_("polyline",{points:"14 2 14 8 20 8"})]});function gr({isOpen:c,position:a,unreadCount:h,onClick:d}){return _("button",{class:`bp-bubble ${a==="bottom-left"?"bp-bubble--left":"bp-bubble--right"}`,onClick:d,"aria-label":c?"Close chat":"Open chat",children:[c?_(Ve,{}):_(lr,{}),!c&&h>0&&_("span",{class:"bp-bubble__badge",children:h>99?"99+":h})]})}function mr({conversations:c,channelInfo:a,loading:h,onSelect:d,onNew:p,t:v}){let A=c.some(M=>M.open),T=a.config.allowReopenConversation;return h?_("div",{class:"bp-loading",children:_("div",{class:"bp-spinner"})}):_("div",{class:"bp-convlist",children:[!A&&_("div",{class:"bp-convlist__new",children:_("button",{class:"bp-convlist__new-btn",onClick:p,children:[_(dr,{}),v.conversations.newConversation]})}),_("div",{class:"bp-convlist__items",children:c.length===0?_("div",{class:"bp-convlist__empty",children:v.conversations.empty}):c.map(M=>{let k=M.open||T;return _("button",{class:"bp-convlist__item",onClick:()=>k&&d(M),disabled:!k,children:[_("div",{class:"bp-convlist__item-top",children:[_("span",{class:"bp-convlist__item-title",children:a.name}),_("span",{class:`bp-convlist__item-status ${M.open?"bp-convlist__item-status--open":"bp-convlist__item-status--closed"}`,children:M.open?v.conversations.open:v.conversations.closed})]}),_("span",{class:"bp-convlist__item-preview",children:M.lastMessage?.content||v.conversations.noMessages})]},M.id)})})]})}function yr({value:c,onChange:a,onSend:h,onFileSelect:d,onFileRemove:p,attachedFile:v,uploading:A,disabled:T,placeholder:M,t:k}){let P=Je(null),y=Je(null),E=ae(m=>{m.key==="Enter"&&!m.shiftKey&&(m.preventDefault(),h())},[h]),S=ae(m=>{let z=m.target;a(z.value),z.style.height="auto",z.style.height=`${Math.min(z.scrollHeight,100)}px`},[a]),H=ae(()=>{y.current?.click()},[]),ne=ae(m=>{let z=m.target,Q=z.files?.[0];Q&&d(Q),z.value=""},[d]),W=v?.file.type.startsWith("image/"),F=(c.trim()||v)&&!T&&!A;return _("div",{class:"bp-composer",children:[v&&_("div",{class:"bp-composer__preview",children:[W&&v.preview?_("img",{src:v.preview,alt:v.file.name,class:"bp-composer__preview-thumb"}):_("div",{class:"bp-composer__preview-icon",children:_(tn,{})}),_("div",{class:"bp-composer__preview-info",children:[_("div",{class:"bp-composer__preview-name",children:v.file.name}),_("div",{class:"bp-composer__preview-status",children:A?k.chat.uploading:Lc(v.file.size)})]}),!A&&_("button",{class:"bp-composer__preview-remove",onClick:p,"aria-label":"Remove file",children:_(Ve,{})})]}),_("div",{class:"bp-composer__row",children:[_("button",{class:"bp-composer__attach",onClick:H,disabled:T||A||!!v,"aria-label":k.chat.attachFile,children:_(fr,{})}),_("textarea",{ref:P,class:"bp-composer__field",value:c,onInput:S,onKeyDown:E,placeholder:M||k.chat.placeholder,disabled:T,rows:1}),_("button",{class:"bp-composer__send",onClick:h,disabled:!F,"aria-label":"Send message",children:_(ur,{})})]}),_("input",{type:"file",ref:y,onChange:ne,style:{display:"none"},accept:"image/*,video/mp4,audio/*,.pdf,.doc,.docx,.xls,.xlsx,.txt"})]})}function Lc(c){return c<1024?`${c} B`:c<1024*1024?`${(c/1024).toFixed(0)} KB`:`${(c/(1024*1024)).toFixed(1)} MB`}function vr({src:c,alt:a,onClose:h}){let d=ae(p=>{p.key==="Escape"&&h()},[h]);return je(()=>(document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)),[d]),_("div",{class:"bp-lightbox",onClick:h,children:[_("button",{class:"bp-lightbox__close",onClick:h,children:_(Ve,{})}),_("img",{src:c,alt:a||"",class:"bp-lightbox__img",onClick:p=>p.stopPropagation()})]})}function _r({media:c,onImageClick:a,t:h}){let d=(c.mimeType||"").toLowerCase();if(d.startsWith("image/")||c.kind==="image"){let p=c.streamUrlData?.small||c.url,v=c.streamUrlData?.large||c.url;return _("img",{src:p,alt:c.name,class:"bp-media-img",onClick:()=>a(v)})}return d.startsWith("video/")?_("video",{controls:!0,class:"bp-media-video",preload:"metadata",children:_("source",{src:c.url,type:d})}):_("a",{href:c.url,target:"_blank",rel:"noopener noreferrer",class:"bp-media-file",download:c.name,children:[_("div",{class:"bp-media-file__icon",children:_(tn,{})}),_("span",{class:"bp-media-file__name",children:c.name}),_("span",{class:"bp-media-file__download",children:_(pr,{})})]})}function br({messages:c,loading:a,t:h}){let d=Je(null),[p,v]=se(null);return je(()=>{d.current?.scrollIntoView({behavior:"smooth"})},[c]),a?_("div",{class:"bp-loading",children:_("div",{class:"bp-spinner"})}):_("div",{class:"bp-messages",children:[c.map(A=>_(Uc,{message:A,onImageClick:v,t:h},A.id)),_("div",{ref:d}),p&&_(vr,{src:p,onClose:()=>v(null)})]})}function Uc({message:c,onImageClick:a,t:h}){let d=c.role==="client",p=d?"bp-msg bp-msg--client":"bp-msg bp-msg--agent",v=new Date(c.createdAt).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return _("div",{class:p,children:[!d&&_("div",{class:"bp-msg__avatar",children:c.user?.avatar?.url?_("img",{src:c.user.avatar.url,alt:c.user.firstName||"Agent"}):(c.user?.firstName?.[0]||"A").toUpperCase()}),_("div",{class:"bp-msg__body",children:[c.media&&_(_r,{media:c.media,onImageClick:a,t:h}),c.content&&_("div",{class:"bp-msg__content",children:c.content}),_("div",{class:"bp-msg__time",children:v})]})]})}function wr({channelInfo:c,onSubmit:a,loading:h,t:d}){let[p,v]=se(""),[A,T]=se(""),{requireName:M,requireEmail:k,privacyPolicyUrl:P}=c.config,y=S=>{S.preventDefault(),a({name:p.trim()||void 0,email:A.trim()||void 0})},E=(!M||p.trim())&&(!k||A.trim());return _("form",{class:"bp-prechat",onSubmit:y,children:[_("div",{class:"bp-prechat__title",children:d.prechat.title}),_("div",{class:"bp-prechat__desc",children:d.prechat.description}),M&&_("div",{class:"bp-prechat__field",children:[_("label",{class:"bp-prechat__label",children:d.prechat.name}),_("input",{class:"bp-prechat__input",type:"text",value:p,onInput:S=>v(S.target.value),placeholder:d.prechat.namePlaceholder,required:!0})]}),k&&_("div",{class:"bp-prechat__field",children:[_("label",{class:"bp-prechat__label",children:d.prechat.email}),_("input",{class:"bp-prechat__input",type:"email",value:A,onInput:S=>T(S.target.value),placeholder:d.prechat.emailPlaceholder,required:!0})]}),_("button",{class:"bp-prechat__submit",type:"submit",disabled:!E||h,children:h?d.prechat.loading:d.prechat.start}),P&&_("div",{class:"bp-prechat__privacy",children:[d.prechat.privacyPrefix," ",_("a",{href:P,target:"_blank",rel:"noopener noreferrer",children:d.prechat.privacyLink})]})]})}function Cr({channelInfo:c,apiClient:a,realtimeClient:h,storage:d,events:p,visitor:v,isAuthenticated:A,position:T,onClose:M,t:k,initialConversationId:P}){let[y,E]=se("chat"),[S,H]=se(null),[ne,W]=se([]),[F,m]=se([]),[z,Q]=se(""),[me,le]=se(!0),[he,Ee]=se(!1),[o,re]=se(null),[Oe,w]=se(null),[ce,Tt]=se(!1),G=S?.open!==!1,ue=c.config.allowViewHistory&&A,Qe=Je(async()=>{});je(()=>((async()=>{le(!0);try{if(ue){let N=await a.getVisitorConversations();if(W(N),P){let X=N.find(ve=>ve.id===P);if(X){await ye(X);return}}N.length>0?E("conversations"):de()?E("prechat"):await ze()}else{let N=P||d.getConversationId();if(N)try{let X=await a.getConversation(N),ve=await a.getMessages(N,{limit:50});m(Array.isArray(ve)?ve.reverse():[]),H(X),E("chat"),X.open&&Pe(N)}catch{d.clear(),de()?E("prechat"):await ze()}else de()?E("prechat"):await ze()}}catch(N){console.error("[BaseportalChat] Error initializing:",N)}finally{le(!1)}})(),()=>{h.unsubscribe()}),[]);let de=ae(()=>v?.name&&v?.email?!1:c.config.requireName||c.config.requireEmail,[c,v]),Pe=ae(D=>{h.subscribe(D,{onMessage:N=>{m(X=>X.some(Y=>Y.id===N.id)?X.map(Y=>Y.id===N.id?{...Y,...N}:Y):[...X.filter(Y=>!String(Y.id).startsWith("temp-")||Y.content!==N.content),N]),p.emit("message:received",N)},onConversationStatusUpdate:N=>{H(X=>X&&{...X,open:N.open}),N.open||p.emit("conversation:closed",N)}})},[h,p,d,ue,a,de]),ye=ae(async D=>{le(!0);try{let N=await a.getMessages(D.id,{limit:50});m(Array.isArray(N)?N.reverse():[]),H(D),E("chat"),d.setConversationId(D.id),Pe(D.id)}catch(N){console.error("[BaseportalChat] Error opening conversation:",N)}finally{le(!1)}},[a,d,Pe]),ze=ae(async()=>{le(!0);try{let D=await a.initConversation({name:v?.name,email:v?.email});H(D),m(D.messages||[]),E("chat"),d.setConversationId(D.id),Pe(D.id),p.emit("conversation:started",D)}catch(D){console.error("[BaseportalChat] Error starting conversation:",D)}finally{le(!1)}},[a,v,d,Pe,p]);Qe.current=ze;let Mt=ae(async D=>{d.setVisitor({...v,...D});let N=await a.initConversation(D);H(N),m(N.messages||[]),E("chat"),d.setConversationId(N.id),Pe(N.id),p.emit("conversation:started",N)},[a,v,d,Pe,p]),sn=ae(async D=>{if(!S)return;let N=25*1024*1024;if(D.size>N){console.warn("[BaseportalChat] File too large");return}let X=D.type.startsWith("image/")?URL.createObjectURL(D):void 0;re({file:D,preview:X}),Tt(!0);try{let ve=await a.uploadFile(S.id,D);w(ve.id)}catch(ve){console.error("[BaseportalChat] Error uploading file:",ve),re(null),X&&URL.revokeObjectURL(X)}finally{Tt(!1)}},[a,S]),rn=ae(()=>{o?.preview&&URL.revokeObjectURL(o.preview),re(null),w(null)},[o]),xt=ae(async()=>{let D=z.trim();if(!D&&!Oe||!S||he)return;let N=`temp-${Date.now()}`,X={id:N,content:D,role:"client",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},ve=Oe||void 0;Q(""),re(null),w(null),Ee(!0),m(Y=>[...Y,X]);try{let Y=await a.sendMessage(S.id,{content:D||void 0,mediaId:ve});m(Se=>Se.map(Le=>Le.id===N?Y:Le)),p.emit("message:sent",Y)}catch(Y){console.error("[BaseportalChat] Error sending message:",Y),m(Le=>Le.filter(lt=>lt.id!==N));let Se=Y instanceof Error?Y.message:"";Se.includes("Row not found")||Se.includes("404")?(h.unsubscribe(),d.clear(),H(null),m([]),ue?(a.getVisitorConversations().then(W).catch(()=>{}),E("conversations")):de()?E("prechat"):await Qe.current()):Q(D)}finally{Ee(!1)}},[z,Oe,S,he,a,p,h,d,ue,de]),It=ae(async()=>{h.unsubscribe(),d.clear(),H(null),m([]),ue?(a.getVisitorConversations().then(W).catch(()=>{}),E("conversations")):de()?E("prechat"):await Qe.current()},[h,d,ue,a,de]),Et=ae(async()=>{if(S)try{let D=await a.reopenConversation(S.id);H(N=>N&&{...N,open:D.open??!0})}catch(D){console.error("[BaseportalChat] Error reopening conversation:",D)}},[S,a]),on=ae(()=>{ue&&y==="chat"?(h.unsubscribe(),E("conversations"),H(null),m([]),a.getVisitorConversations().then(W).catch(()=>{})):M()},[ue,y,h,a,M]),Pt=T==="bottom-left"?"bp-window--left":"bp-window--right",an=y==="conversations"?k.conversations.title:c.name,Ke=ue&&y==="chat"||y==="prechat";return _("div",{class:`bp-window ${Pt}`,children:[_("div",{class:"bp-header",children:[_("div",{class:"bp-header__title",children:[Ke&&_("button",{class:"bp-header__back",onClick:on,children:_(hr,{})}),an]}),_("button",{class:"bp-header__close",onClick:M,children:_(Ve,{})})]}),me&&y!=="chat"?_("div",{class:"bp-loading",children:_("div",{class:"bp-spinner"})}):_(Ae,{children:[y==="prechat"&&_(wr,{channelInfo:c,onSubmit:Mt,loading:me,t:k}),y==="conversations"&&_(mr,{conversations:ne,channelInfo:c,loading:me,onSelect:ye,onNew:de()?()=>E("prechat"):ze,t:k}),y==="chat"&&_(Ae,{children:[_(br,{messages:F,loading:me,t:k}),G?_(yr,{value:z,onChange:Q,onSend:xt,onFileSelect:sn,onFileRemove:rn,attachedFile:o,uploading:ce,disabled:he||me,placeholder:k.chat.placeholder,t:k}):_("div",{class:"bp-closed-banner",children:[_("span",{class:"bp-closed-banner__text",children:k.chat.closed}),c.config.allowReopenConversation?_("button",{class:"bp-closed-banner__reopen",onClick:Et,children:k.chat.reopen}):_("button",{class:"bp-closed-banner__reopen",onClick:It,children:k.chat.newConversation})]}),c.config.privacyPolicyUrl&&_("div",{class:"bp-privacy-footer",children:_("a",{href:c.config.privacyPolicyUrl,target:"_blank",rel:"noopener noreferrer",children:k.prechat.privacyLink})})]})]})]})}function Rr({channelInfo:c,apiClient:a,realtimeClient:h,storage:d,events:p,visitor:v,isAuthenticated:A,position:T,hidden:M,t:k,isOpenRef:P,setIsOpen:y}){let[E,S]=se(P.current),[H,ne]=se(M),[W]=se(0);return je(()=>{let z=()=>{S(!0),P.current=!0,y(!0)},Q=()=>{S(!1),P.current=!1,y(!1)},me=()=>ne(!1),le=()=>{ne(!0),S(!1),P.current=!1,y(!1)};return p.on("_open",z),p.on("_close",Q),p.on("show",me),p.on("hide",le),()=>{p.off("_open",z),p.off("_close",Q),p.off("show",me),p.off("hide",le)}},[p,P,y]),_(Ae,{children:[!H&&_(gr,{isOpen:E,position:T,unreadCount:W,onClick:()=>{let z=!E;S(z),P.current=z,y(z),p.emit(z?"open":"close")}}),E&&_(Cr,{channelInfo:c,apiClient:a,realtimeClient:h,storage:d,events:p,visitor:v,isAuthenticated:A,position:T,onClose:()=>{S(!1),P.current=!1,y(!1),p.emit("close")},t:k})]})}var kr=`#baseportal-chat-widget {
7
+ `;return l.mac=l.mac||Fr(O,r),o.logAction(this.logger,o.LOG_MINOR,"Auth.getTokenRequest()","generated signed request"),l}async getAuthParams(){if(this.method=="basic")return{key:this.key};{let e=await this._ensureValidAuthCredentials(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{access_token:e.token}}}async getAuthHeaders(){if(this.method=="basic")return{authorization:"Basic "+this.basicKey};{let e=await this._ensureValidAuthCredentials(!1);if(!e)throw new Error("Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails");return{authorization:"Bearer "+Ut(e.token)}}}async getTimestamp(e){return!this.isTimeOffsetSet()&&(e||this.authOptions.queryTime)?this.client.time():this.getTimestampUsingOffset()}getTimestampUsingOffset(){return Date.now()+(this.client.serverTimeOffset||0)}isTimeOffsetSet(){return this.client.serverTimeOffset!==null}_saveBasicOptions(e){this.method="basic",this.key=e.key,this.basicKey=Ut(e.key),this.authOptions=e||{},"clientId"in e&&this._userSetClientId(e.clientId)}_saveTokenOptions(e,t){this.method="token",e&&(this.tokenParams=e),t&&(t.token&&(t.tokenDetails=typeof t.token=="string"?{token:t.token}:t.token),t.tokenDetails&&(this.tokenDetails=t.tokenDetails),"clientId"in t&&this._userSetClientId(t.clientId),this.authOptions=t)}async _ensureValidAuthCredentials(e){let t=this.tokenDetails;if(t){if(this._tokenClientIdMismatch(t.clientId))throw new w("Mismatch between clientId in token ("+t.clientId+") and current clientId ("+this.clientId+")",40102,403);if(!this.isTimeOffsetSet()||!t.expires||t.expires>=this.getTimestampUsingOffset())return o.logAction(this.logger,o.LOG_MINOR,"Auth.getToken()","using cached token; expires = "+t.expires),t;o.logAction(this.logger,o.LOG_MINOR,"Auth.getToken()","deleting expired token"),this.tokenDetails=null}let n=(this.waitingForTokenRequest||(this.waitingForTokenRequest=dn.create(this.logger))).createPromise();if(this.currentTokenRequestId!==null&&!e)return n;let i=this.currentTokenRequestId=zr(),s,r=null;try{s=await this.requestToken(this.tokenParams,this.authOptions)}catch(u){r=u}if(this.currentTokenRequestId>i)return o.logAction(this.logger,o.LOG_MINOR,"Auth._ensureValidAuthCredentials()","Discarding token request response; overtaken by newer one"),n;this.currentTokenRequestId=null;let l=this.waitingForTokenRequest;return this.waitingForTokenRequest=null,r?(l?.rejectAll(r),n):(l?.resolveAll(this.tokenDetails=s),n)}_userSetClientId(e){if(typeof e=="string"||e===null){if(e==="*")throw new w('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, instantiate the library with {defaultTokenParams: {clientId: "*"}}), or if calling authorize(), pass it in as a tokenParam: authorize({clientId: "*"}, authOptions)',40012,400);{let t=this._uncheckedSetClientId(e);if(t)throw t}}else throw new w("clientId must be either a string or null",40012,400)}_uncheckedSetClientId(e){if(this._tokenClientIdMismatch(e)){let t="Unexpected clientId mismatch: client has "+this.clientId+", requested "+e,n=new w(t,40102,401);return o.logAction(this.logger,o.LOG_ERROR,"Auth._uncheckedSetClientId()",t),n}else return this.clientId=this.tokenParams.clientId=e,null}_tokenClientIdMismatch(e){return!!(this.clientId&&this.clientId!=="*"&&e&&e!=="*"&&this.clientId!==e)}static isTokenErr(e){return e.code&&e.code>=40140&&e.code<40150}revokeTokens(e,t){return this.client.rest.revokeTokens(e,t)}},Ue=Kr;function pn(e){let t=[];if(e)for(let n in e)t.push(n+"="+e[n]);return t.join("&")}function Qe(e,t){return e+(t?"?":"")+pn(t)}function $r(e,t,n,i,s){e.error?o.logActionNoStrip(s,o.LOG_MICRO,"Http."+t+"()","Received Error; "+Qe(n,i)+"; Error: "+J(e.error)):o.logActionNoStrip(s,o.LOG_MICRO,"Http."+t+"()","Received; "+Qe(n,i)+"; Headers: "+pn(e.headers)+"; StatusCode: "+e.statusCode+"; Body"+(m.BufferUtils.isBuffer(e.body)?" (Base64): "+m.BufferUtils.base64Encode(e.body):": "+e.body))}function Jr(e,t,n,i,s){s.shouldLog(o.LOG_MICRO)&&o.logActionNoStrip(s,o.LOG_MICRO,"Http."+e+"()","Sending; "+Qe(t,i)+"; Body"+(m.BufferUtils.isBuffer(n)?" (Base64): "+m.BufferUtils.base64Encode(n):": "+n))}var gn=class{constructor(e){this.client=e,this.platformHttp=new m.Http(e),this.checkConnectivity=this.platformHttp.checkConnectivity?()=>this.platformHttp.checkConnectivity():void 0}get logger(){var e,t;return(t=(e=this.client)==null?void 0:e.logger)!=null?t:o.defaultLogger}get supportsAuthHeaders(){return this.platformHttp.supportsAuthHeaders}get supportsLinkHeaders(){return this.platformHttp.supportsLinkHeaders}_getHosts(e){let t=e.connection,n=t&&t.connectionManager.host;return n?[n].concat(U.getFallbackHosts(e.options)):U.getHosts(e.options)}async do(e,t,n,i,s){try{let r=this.client;if(!r)return{error:new w("http.do called without client",5e4,500)};let l=typeof t=="function"?t:function(C){return r.baseUri(C)+t},u=r._currentFallback;if(u)if(u.validUntil>Date.now()){let C=await this.doUri(e,l(u.host),n,i,s);return C.error&&this.platformHttp.shouldFallback(C.error)?(r._currentFallback=null,this.do(e,t,n,i,s)):C}else r._currentFallback=null;let g=this._getHosts(r);if(g.length===1)return this.doUri(e,l(g[0]),n,i,s);let f=null,b=async(C,O)=>{let R=C.shift();f=f??new Date;let I=await this.doUri(e,l(R),n,i,s);return I.error&&this.platformHttp.shouldFallback(I.error)&&C.length?Date.now()-f.getTime()>r.options.timeouts.httpMaxRetryDuration?{error:new w(`Timeout for trying fallback hosts retries. Total elapsed time exceeded the ${r.options.timeouts.httpMaxRetryDuration}ms limit`,50003,500)}:b(C,!0):(O&&(r._currentFallback={host:R,validUntil:Date.now()+r.options.timeouts.fallbackRetryTimeout}),I)};return b(g)}catch(r){return{error:new w(`Unexpected error in Http.do: ${J(r)}`,500,5e4)}}}async doUri(e,t,n,i,s){try{Jr(e,t,i,s,this.logger);let r=await this.platformHttp.doUri(e,t,n,i,s);return this.logger.shouldLog(o.LOG_MICRO)&&$r(r,e,t,s,this.logger),r}catch(r){return{error:new w(`Unexpected error in Http.doUri: ${J(r)}`,500,5e4)}}}},Pi=class{constructor(e){this.Platform=m,this.ErrorInfo=w,this.Logger=o,this.Defaults=U,this.Utils=re;var t,n,i,s,r,l,u,g;this._additionalHTTPRequestImplementations=(t=e.plugins)!=null?t:null,this.logger=new o,this.logger.setLog(e.logLevel,e.logHandler),o.logAction(this.logger,o.LOG_MICRO,"BaseClient()","initialized with clientOptions "+m.Config.inspect(e)),this._MsgPack=(i=(n=e.plugins)==null?void 0:n.MsgPack)!=null?i:null;let f=this.options=U.normaliseOptions(e,this._MsgPack,this.logger);if(f.key){let b=f.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!b){let C="invalid key parameter";throw o.logAction(this.logger,o.LOG_ERROR,"BaseClient()",C),new w(C,40400,404)}f.keyName=b[1],f.keySecret=b[2]}if("clientId"in f)if(typeof f.clientId=="string"||f.clientId===null){if(f.clientId==="*")throw new w('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400)}else throw new w("clientId must be either a string or null",40012,400);o.logAction(this.logger,o.LOG_MINOR,"BaseClient()","started; version = "+U.version),this._currentFallback=null,this.serverTimeOffset=null,this.http=new gn(this),this.auth=new Ue(this,f),this._rest=(s=e.plugins)!=null&&s.Rest?new e.plugins.Rest(this):null,this._Crypto=(l=(r=e.plugins)==null?void 0:r.Crypto)!=null?l:null,this.__FilteredSubscriptions=(g=(u=e.plugins)==null?void 0:u.MessageInteractions)!=null?g:null}get rest(){return this._rest||Ce("Rest"),this._rest}get _FilteredSubscriptions(){return this.__FilteredSubscriptions||Ce("MessageInteractions"),this.__FilteredSubscriptions}get channels(){return this.rest.channels}get push(){return this.rest.push}get device(){var e;return(!((e=this.options.plugins)!=null&&e.Push)||!this.push.LocalDevice)&&Ce("Push"),this._device||(this._device=this.push.LocalDevice.load(this)),this._device}baseUri(e){return U.getHttpScheme(this.options)+e+":"+U.getPort(this.options,!1)}async stats(e){return this.rest.stats(e)}async time(e){return this.rest.time(e)}async request(e,t,n,i,s,r){return this.rest.request(e,t,n,i,s,r)}batchPublish(e){return this.rest.batchPublish(e)}batchPresence(e){return this.rest.batchPresence(e)}setLog(e){this.logger.setLog(e.level,e.handler)}};Pi.Platform=m;var Li=Pi,Qr=class st{toJSON(){var t,n,i;return{id:this.id,deviceSecret:this.deviceSecret,platform:this.platform,formFactor:this.formFactor,clientId:this.clientId,metadata:this.metadata,deviceIdentityToken:this.deviceIdentityToken,push:{recipient:(t=this.push)==null?void 0:t.recipient,state:(n=this.push)==null?void 0:n.state,error:(i=this.push)==null?void 0:i.error}}}toString(){var t,n,i,s;let r="[DeviceDetails";return this.id&&(r+="; id="+this.id),this.platform&&(r+="; platform="+this.platform),this.formFactor&&(r+="; formFactor="+this.formFactor),this.clientId&&(r+="; clientId="+this.clientId),this.metadata&&(r+="; metadata="+this.metadata),this.deviceIdentityToken&&(r+="; deviceIdentityToken="+JSON.stringify(this.deviceIdentityToken)),(t=this.push)!=null&&t.recipient&&(r+="; push.recipient="+JSON.stringify(this.push.recipient)),(n=this.push)!=null&&n.state&&(r+="; push.state="+this.push.state),(i=this.push)!=null&&i.error&&(r+="; push.error="+JSON.stringify(this.push.error)),(s=this.push)!=null&&s.metadata&&(r+="; push.metadata="+this.push.metadata),r+="]",r}static toRequestBody(t,n,i){return Me(t,n,i)}static fromResponseBody(t,n,i){return i&&(t=Ae(t,n,i)),Array.isArray(t)?st.fromValuesArray(t):st.fromValues(t)}static fromValues(t){return t.error=t.error&&w.fromValues(t.error),Object.assign(new st,t)}static fromLocalDevice(t){return Object.assign(new st,t)}static fromValuesArray(t){let n=t.length,i=new Array(n);for(let s=0;s<n;s++)i[s]=st.fromValues(t[s]);return i}},Xe=Qr;async function Ui(e,t,n,i){if(e.http.supportsAuthHeaders){let s=await e.auth.getAuthHeaders();return i(G(s,t),n)}else{let s=await e.auth.getAuthParams();return i(t,G(s,n))}}function Xr(e,t,n){if(e.err&&!e.body)return{err:e.err};if(e.statusCode===qt.NoContent)return E(y({},e),{body:[],unpacked:!0});let i=e.body;if(!e.unpacked)try{i=Ae(i,t,n)}catch(u){return lt(u)?{err:u}:{err:new ce(J(u),null)}}if(!i)return{err:new ce("unenvelope(): Response body is missing",null)};let{statusCode:s,response:r,headers:l}=i;if(s===void 0)return E(y({},e),{body:i,unpacked:!0});if(s<200||s>=300){let u=r&&r.error||e.err;return u||(u=new Error("Error in unenveloping "+i),u.statusCode=s),{err:u,body:r,headers:l,unpacked:!0,statusCode:s}}return{err:e.err,body:r,headers:l,unpacked:!0,statusCode:s}}function Yr(e,t,n,i,s){e.err?o.logAction(s,o.LOG_MICRO,"Resource."+t+"()","Received Error; "+Qe(n,i)+"; Error: "+J(e.err)):o.logAction(s,o.LOG_MICRO,"Resource."+t+"()","Received; "+Qe(n,i)+"; Headers: "+pn(e.headers)+"; StatusCode: "+e.statusCode+"; Body: "+(m.BufferUtils.isBuffer(e.body)?" (Base64): "+m.BufferUtils.base64Encode(e.body):": "+m.Config.inspect(e.body)))}var Zr=class rt{static async get(t,n,i,s,r,l){return rt.do(Z.Get,t,n,null,i,s,r,l??!1)}static async delete(t,n,i,s,r,l){return rt.do(Z.Delete,t,n,null,i,s,r,l)}static async post(t,n,i,s,r,l,u){return rt.do(Z.Post,t,n,i,s,r,l,u)}static async patch(t,n,i,s,r,l,u){return rt.do(Z.Patch,t,n,i,s,r,l,u)}static async put(t,n,i,s,r,l,u){return rt.do(Z.Put,t,n,i,s,r,l,u)}static async do(t,n,i,s,r,l,u,g){u&&((l=l||{}).envelope=u);let f=n.logger;async function b(O,R){var I;if(f.shouldLog(o.LOG_MICRO)){let L=s;if(((I=O["content-type"])==null?void 0:I.indexOf("msgpack"))>0)try{n._MsgPack||Ce("MsgPack"),L=n._MsgPack.decode(s)}catch(j){o.logAction(f,o.LOG_MICRO,"Resource."+t+"()","Sending MsgPack Decoding Error: "+J(j))}o.logAction(f,o.LOG_MICRO,"Resource."+t+"()","Sending; "+Qe(i,R)+"; Body: "+L)}let x=await n.http.do(t,i,O,s,R);return x.error&&Ue.isTokenErr(x.error)?(await n.auth.authorize(null,null),Ui(n,O,R,b)):{err:x.error,body:x.body,headers:x.headers,unpacked:x.unpacked,statusCode:x.statusCode}}let C=await Ui(n,r,l,b);if(u&&(C=Xr(C,n._MsgPack,u)),f.shouldLog(o.LOG_MICRO)&&Yr(C,t,i,l,f),g){if(C.err)throw C.err;{let O=y({},C);return delete O.err,O}}return C}},oe=Zr;function eo(e){let t=e.match(/^\.\/(\w+)\?(.*)$/);return t&&t[2]&&we(t[2])}function to(e){typeof e=="string"&&(e=e.split(","));let t={};for(let n=0;n<e.length;n++){let i=e[n].match(/^\s*<(.+)>;\s*rel="(\w+)"$/);if(i){let s=eo(i[1]);s&&(t[i[2]]=s)}}return t}function no(e,t,n){return!(n&&(t||typeof e.code=="number"))}var io=class{constructor(e,t,n,i,s,r){this.client=e,this.path=t,this.headers=n,this.envelope=i??null,this.bodyHandler=s,this.useHttpPaginatedResponse=r||!1}get logger(){return this.client.logger}async get(e){let t=await oe.get(this.client,this.path,this.headers,e,this.envelope,!1);return this.handlePage(t)}async delete(e){let t=await oe.delete(this.client,this.path,this.headers,e,this.envelope,!1);return this.handlePage(t)}async post(e,t){let n=await oe.post(this.client,this.path,t,this.headers,e,this.envelope,!1);return this.handlePage(n)}async put(e,t){let n=await oe.put(this.client,this.path,t,this.headers,e,this.envelope,!1);return this.handlePage(n)}async patch(e,t){let n=await oe.patch(this.client,this.path,t,this.headers,e,this.envelope,!1);return this.handlePage(n)}async handlePage(e){if(e.err&&no(e.err,e.body,this.useHttpPaginatedResponse))throw o.logAction(this.logger,o.LOG_ERROR,"PaginatedResource.handlePage()","Unexpected error getting resource: err = "+J(e.err)),e.err;let t,n,i;try{t=e.statusCode==qt.NoContent?[]:await this.bodyHandler(e.body,e.headers||{},e.unpacked)}catch(s){throw e.err||s}return e.headers&&(n=e.headers.Link||e.headers.link)&&(i=to(n)),this.useHttpPaginatedResponse?new so(this,t,e.headers||{},e.statusCode,i,e.err):new Ni(this,t,i)}},Ni=class{constructor(e,t,n){this.resource=e,this.items=t;let i=this;n&&("first"in n&&(this.first=async function(){return i.get(n.first)}),"current"in n&&(this.current=async function(){return i.get(n.current)}),this.next=async function(){return"next"in n?i.get(n.next):null},this.hasNext=function(){return"next"in n},this.isLast=()=>{var s;return!((s=this.hasNext)!=null&&s.call(this))})}async get(e){let t=this.resource,n=await oe.get(t.client,t.path,t.headers,e,t.envelope,!1);return t.handlePage(n)}},so=class extends Ni{constructor(e,t,n,i,s,r){super(e,t,s),this.statusCode=i,this.success=i<300&&i>=200,this.headers=n,this.errorCode=r&&r.code,this.errorMessage=r&&r.message}toJSON(){return{items:this.items,statusCode:this.statusCode,success:this.success,headers:this.headers,errorCode:this.errorCode,errorMessage:this.errorMessage}}},qe=io,Bi=class Ct{toJSON(){return{channel:this.channel,deviceId:this.deviceId,clientId:this.clientId}}toString(){let t="[PushChannelSubscription";return this.channel&&(t+="; channel="+this.channel),this.deviceId&&(t+="; deviceId="+this.deviceId),this.clientId&&(t+="; clientId="+this.clientId),t+="]",t}static fromResponseBody(t,n,i){return i&&(t=Ae(t,n,i)),Array.isArray(t)?Ct.fromValuesArray(t):Ct.fromValues(t)}static fromValues(t){return Object.assign(new Ct,t)}static fromValuesArray(t){let n=t.length,i=new Array(n);for(let s=0;s<n;s++)i[s]=Ct.fromValues(t[s]);return i}};Bi.toRequestBody=Me;var ro=Bi,mn=ro,oo=class{constructor(e){var t;this.client=e,this.admin=new ao(e),m.Config.push&&((t=e.options.plugins)!=null&&t.Push)&&(this.stateMachine=new e.options.plugins.Push.ActivationStateMachine(e),this.LocalDevice=e.options.plugins.Push.localDeviceFactory(Xe))}async activate(e,t){await new Promise((n,i)=>{var s;if(!((s=this.client.options.plugins)!=null&&s.Push)){i(Nt("Push"));return}if(!this.stateMachine){i(new w("This platform is not supported as a target of push notifications",4e4,400));return}if(this.stateMachine.activatedCallback){i(new w("Activation already in progress",4e4,400));return}this.stateMachine.activatedCallback=r=>{if(r){i(r);return}n()},this.stateMachine.updateFailedCallback=t,this.stateMachine.handleEvent(new this.client.options.plugins.Push.CalledActivate(this.stateMachine,e))})}async deactivate(e){await new Promise((t,n)=>{var i;if(!((i=this.client.options.plugins)!=null&&i.Push)){n(Nt("Push"));return}if(!this.stateMachine){n(new w("This platform is not supported as a target of push notifications",4e4,400));return}if(this.stateMachine.deactivatedCallback){n(new w("Deactivation already in progress",4e4,400));return}this.stateMachine.deactivatedCallback=s=>{if(s){n(s);return}t()},this.stateMachine.handleEvent(new this.client.options.plugins.Push.CalledDeactivate(this.stateMachine,e))})}},ao=class{constructor(e){this.client=e,this.deviceRegistrations=new co(e),this.channelSubscriptions=new lo(e)}async publish(e,t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=U.defaultPostHeaders(n.options,{format:i}),r={},l=G({recipient:e},t);G(s,n.options.headers),n.options.pushFullWait&&G(r,{fullWait:"true"});let u=Me(l,n._MsgPack,i);await oe.post(n,"/push/publish",u,s,r,null,!0)}},co=class{constructor(e){this.client=e}async save(e){let t=this.client,n=Xe.fromValues(e),i=t.options.useBinaryProtocol?"msgpack":"json",s=U.defaultPostHeaders(t.options,{format:i}),r={};G(s,t.options.headers),t.options.pushFullWait&&G(r,{fullWait:"true"});let l=Me(n,t._MsgPack,i),u=await oe.put(t,"/push/deviceRegistrations/"+encodeURIComponent(e.id),l,s,r,null,!0);return Xe.fromResponseBody(u.body,t._MsgPack,u.unpacked?void 0:i)}async get(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=U.defaultGetHeaders(t.options,{format:n}),s=e.id||e;if(typeof s!="string"||!s.length)throw new w("First argument to DeviceRegistrations#get must be a deviceId string or DeviceDetails",4e4,400);G(i,t.options.headers);let r=await oe.get(t,"/push/deviceRegistrations/"+encodeURIComponent(s),i,{},null,!0);return Xe.fromResponseBody(r.body,t._MsgPack,r.unpacked?void 0:n)}async list(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=this.client.http.supportsLinkHeaders?void 0:n,s=U.defaultGetHeaders(t.options,{format:n});return G(s,t.options.headers),new qe(t,"/push/deviceRegistrations",s,i,async function(r,l,u){return Xe.fromResponseBody(r,t._MsgPack,u?void 0:n)}).get(e)}async remove(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=U.defaultGetHeaders(t.options,{format:n}),s={},r=e.id||e;if(typeof r!="string"||!r.length)throw new w("First argument to DeviceRegistrations#remove must be a deviceId string or DeviceDetails",4e4,400);G(i,t.options.headers),t.options.pushFullWait&&G(s,{fullWait:"true"}),await oe.delete(t,"/push/deviceRegistrations/"+encodeURIComponent(r),i,s,null,!0)}async removeWhere(e){let t=this.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=U.defaultGetHeaders(t.options,{format:n});G(i,t.options.headers),t.options.pushFullWait&&G(e,{fullWait:"true"}),await oe.delete(t,"/push/deviceRegistrations",i,e,null,!0)}},lo=class Ms{constructor(t){this.remove=Ms.prototype.removeWhere,this.client=t}async save(t){let n=this.client,i=mn.fromValues(t),s=n.options.useBinaryProtocol?"msgpack":"json",r=U.defaultPostHeaders(n.options,{format:s}),l={};G(r,n.options.headers),n.options.pushFullWait&&G(l,{fullWait:"true"});let u=Me(i,n._MsgPack,s),g=await oe.post(n,"/push/channelSubscriptions",u,r,l,null,!0);return mn.fromResponseBody(g.body,n._MsgPack,g.unpacked?void 0:s)}async list(t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=this.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),new qe(n,"/push/channelSubscriptions",r,s,async function(l,u,g){return mn.fromResponseBody(l,n._MsgPack,g?void 0:i)}).get(t)}async removeWhere(t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=U.defaultGetHeaders(n.options,{format:i});G(s,n.options.headers),n.options.pushFullWait&&G(t,{fullWait:"true"}),await oe.delete(n,"/push/channelSubscriptions",s,t,null,!0)}async listChannels(t){let n=this.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=this.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),n.options.pushFullWait&&G(t,{fullWait:"true"}),new qe(n,"/push/channels",r,s,async function(l,u,g){let f=!g&&i?Ae(l,n._MsgPack,i):l;for(let b=0;b<f.length;b++)f[b]=String(f[b]);return f}).get(t)}},ho=oo,Gi=["message.unset","message.create","message.update","message.delete","annotation.create","annotation.delete","meta.occupancy"],uo=new Map(Gi.map((e,t)=>[e,t])),fo=new Map(Gi.map((e,t)=>[t,e]));function po(e){return fo.get(e)}function go(e){return e?uo.get(e):void 0}function mo(e){return!e||!e.channelOptions?{channelOptions:e,plugins:{},baseEncodedPreviousPayload:void 0}:e}function qi(e,t,n){if(n&&n.cipher){e||Ce("Crypto");let i=e.getCipher(n.cipher,t);return{cipher:i.cipherParams,channelCipher:i.cipher}}return n??{}}function yo(e){let t=0;return e.name&&(t+=e.name.length),e.clientId&&(t+=e.clientId.length),e.extras&&(t+=JSON.stringify(e.extras).length),e.data&&(t+=ui(e.data)),t}async function Di(e,t,n,i){let s=Dt(n),r=qi(t,e,i??null);try{await ht(s,r)}catch(l){o.logAction(e,o.LOG_ERROR,"Message.fromEncoded()",l.toString())}return s}async function vo(e,t,n,i){return Promise.all(n.map(function(s){return Di(e,t,s,i)}))}async function _o(e,t){let n=Dt(e);try{await ht(n,t.channelOptions)}catch(i){o.logAction(t.logger,o.LOG_ERROR,"Message._fromEncoded()",i.toString())}return n}async function bo(e,t){return Promise.all(e.map(function(n){return _o(n,t)}))}async function wo(e,t){let n=e.data,i=e.encoding,s=t.channelCipher;i=i?i+"/":"",m.BufferUtils.isBuffer(n)||(n=m.BufferUtils.utf8Encode(String(n)),i=i+"utf-8/");let r=await s.encrypt(n);return e.data=r,e.encoding=i+"cipher+"+s.algorithm,e}async function yn(e,t){let n=e.data;if(!(typeof n=="string"||m.BufferUtils.isBuffer(n)||n===null||n===void 0))if(me(n)||Array.isArray(n))e.data=JSON.stringify(n),e.encoding=e.encoding?e.encoding+"/json":"json";else throw new w("Data type is unsupported",40013,400);return t!=null&&t.cipher?wo(e,t):e}async function Hi(e,t){return Promise.all(e.map(n=>yn(n,t)))}var Co=Me;async function ht(e,t){let n=mo(t),i=e.data,s=e.encoding;if(s){let r=s.split("/"),l,u=r.length,g=e.data,f="";try{for(;(l=u)>0;){let b=r[--u].match(/([-\w]+)(\+([\w-]+))?/);if(!b)break;switch(f=b[1],f){case"base64":g=m.BufferUtils.base64Decode(String(g)),l==r.length&&(i=g);continue;case"utf-8":g=m.BufferUtils.utf8Decode(g);continue;case"json":g=JSON.parse(g);continue;case"cipher":if(n.channelOptions!=null&&n.channelOptions.cipher&&n.channelOptions.channelCipher){let C=b[3],O=n.channelOptions.channelCipher;if(C!=O.algorithm)throw new Error("Unable to decrypt message with given cipher; incompatible cipher params");g=await O.decrypt(g);continue}else throw new Error("Unable to decrypt message; not an encrypted channel");case"vcdiff":if(!n.plugins||!n.plugins.vcdiff)throw new w("Missing Vcdiff decoder (https://github.com/ably-forks/vcdiff-decoder)",40019,400);if(typeof Uint8Array>"u")throw new w("Delta decoding not supported on this browser (need ArrayBuffer & Uint8Array)",40020,400);try{let C=n.baseEncodedPreviousPayload;typeof C=="string"&&(C=m.BufferUtils.utf8Encode(C));let O=m.BufferUtils.toBuffer(C);g=m.BufferUtils.toBuffer(g),g=m.BufferUtils.arrayBufferViewToBuffer(n.plugins.vcdiff.decode(g,O)),i=g}catch(C){throw new w("Vcdiff delta decode failed with "+C,40018,400)}continue;default:throw new Error("Unknown encoding")}}}catch(b){let C=b;throw new w("Error processing the "+f+" encoding, decoder returned \u2018"+C.message+"\u2019",C.code||40013,400)}finally{e.encoding=l<=0?null:r.slice(0,l).join("/"),e.data=g}}n.baseEncodedPreviousPayload=i}function Ye(e){return Object.assign(new bn,e)}function Dt(e){let t=po(e.action)||e.action,n=Object.assign(new bn,E(y({},e),{action:t}));return n.expandFields(),n}function vn(e){return e.map(Ye)}function _n(e){let t,n=0;for(let i=0;i<e.length;i++)t=e[i],n+=t.size||(t.size=yo(t));return n}var bn=class{toJSON(){let e=this.encoding,t=this.data;return t&&m.BufferUtils.isBuffer(t)&&(arguments.length>0?(e=e?e+"/base64":"base64",t=m.BufferUtils.base64Encode(t)):t=m.BufferUtils.toBuffer(t)),{name:this.name,id:this.id,clientId:this.clientId,connectionId:this.connectionId,connectionKey:this.connectionKey,extras:this.extras,serial:this.serial,action:go(this.action)||this.action,refSerial:this.refSerial,refType:this.refType,createdAt:this.createdAt,version:this.version,operation:this.operation,encoding:e,data:t}}expandFields(){this.action==="message.create"&&(this.version&&!this.serial&&(this.serial=this.version),this.timestamp&&!this.createdAt&&(this.createdAt=this.timestamp))}toString(){let e="[Message";return this.name&&(e+="; name="+this.name),this.id&&(e+="; id="+this.id),this.timestamp&&(e+="; timestamp="+this.timestamp),this.clientId&&(e+="; clientId="+this.clientId),this.connectionId&&(e+="; connectionId="+this.connectionId),this.encoding&&(e+="; encoding="+this.encoding),this.extras&&(e+="; extras ="+JSON.stringify(this.extras)),this.data&&(typeof this.data=="string"?e+="; data="+this.data:m.BufferUtils.isBuffer(this.data)?e+="; data (buffer)="+m.BufferUtils.base64Encode(this.data):e+="; data (json)="+JSON.stringify(this.data)),this.extras&&(e+="; extras="+JSON.stringify(this.extras)),this.action&&(e+="; action="+this.action),this.serial&&(e+="; serial="+this.serial),this.version&&(e+="; version="+this.version),this.refSerial&&(e+="; refSerial="+this.refSerial),this.refType&&(e+="; refType="+this.refType),this.createdAt&&(e+="; createdAt="+this.createdAt),this.operation&&(e+="; operation="+JSON.stringify(this.operation)),e+="]",e}},Ro=bn,Fi=["absent","present","enter","leave","update"];function ko(e){return Fi.indexOf(e)}async function ji(e,t,n,i){let s=Ht(n),r=qi(t,e,i??null);try{await wn(s,r??{})}catch(l){o.logAction(e,o.LOG_ERROR,"PresenceMessage.fromEncoded()",l.toString())}return s}async function Ao(e,t,n,i){return Promise.all(n.map(function(s){return ji(e,t,s,i)}))}async function Oo(e,t){let n=Ht(e);try{await wn(n,t.channelOptions)}catch(i){o.logAction(t.logger,o.LOG_ERROR,"PresenceMessage._fromEncoded()",i.toString())}return n}async function Wi(e,t){return Promise.all(e.map(function(n){return Oo(n,t)}))}function Ne(e){return Object.assign(new Ft,e)}function Ht(e){let t=Fi[e.action];return Object.assign(new Ft,E(y({},e),{action:t}))}var wn=ht;function Vi(e){return e.map(Ne)}function zi(e){return e instanceof Ft?e:Ne({data:e})}var Ft=class{isSynthesized(){return!this.id||!this.connectionId?!0:this.id.substring(this.connectionId.length,0)!==this.connectionId}parseId(){if(!this.id)throw new Error("parseId(): Presence message does not contain an id");let e=this.id.split(":");return{connectionId:e[0],msgSerial:parseInt(e[1],10),index:parseInt(e[2],10)}}toJSON(){let e=this.data,t=this.encoding;return e&&m.BufferUtils.isBuffer(e)&&(arguments.length>0?(t=t?t+"/base64":"base64",e=m.BufferUtils.base64Encode(e)):e=m.BufferUtils.toBuffer(e)),{id:this.id,clientId:this.clientId,action:ko(this.action),data:e,encoding:t,extras:this.extras}}toString(){let e="[PresenceMessage";return e+="; action="+this.action,this.id&&(e+="; id="+this.id),this.timestamp&&(e+="; timestamp="+this.timestamp),this.clientId&&(e+="; clientId="+this.clientId),this.connectionId&&(e+="; connectionId="+this.connectionId),this.encoding&&(e+="; encoding="+this.encoding),this.data&&(typeof this.data=="string"?e+="; data="+this.data:m.BufferUtils.isBuffer(this.data)?e+="; data (buffer)="+m.BufferUtils.base64Encode(this.data):e+="; data (json)="+JSON.stringify(this.data)),this.extras&&(e+="; extras="+JSON.stringify(this.extras)),e+="]",e}},So=Ft,To=class{constructor(e){this.channel=e}get logger(){return this.channel.logger}async get(e){o.logAction(this.logger,o.LOG_MICRO,"RestPresence.get()","channel = "+this.channel.name);let t=this.channel.client,n=t.options.useBinaryProtocol?"msgpack":"json",i=this.channel.client.http.supportsLinkHeaders?void 0:n,s=U.defaultGetHeaders(t.options,{format:n});return G(s,t.options.headers),new qe(t,this.channel.client.rest.presenceMixin.basePath(this),s,i,async(r,l,u)=>{let g=u?r:Ae(r,t._MsgPack,n);return Wi(g,this.channel)}).get(e)}async history(e){return o.logAction(this.logger,o.LOG_MICRO,"RestPresence.history()","channel = "+this.channel.name),this.channel.client.rest.presenceMixin.history(this,e)}},Mo=To,xo=9;function Io(e){return e.every(function(t){return!t.id})}var Eo=class{constructor(e,t,n){var i,s;o.logAction(e.logger,o.LOG_MINOR,"RestChannel()","started; name = "+t),this.name=t,this.client=e,this.presence=new Mo(this),this.channelOptions=Bt((i=e._Crypto)!=null?i:null,this.logger,n),(s=e.options.plugins)!=null&&s.Push&&(this._push=new e.options.plugins.Push.PushChannel(this))}get push(){return this._push||Ce("Push"),this._push}get logger(){return this.client.logger}setOptions(e){var t;this.channelOptions=Bt((t=this.client._Crypto)!=null?t:null,this.logger,e)}async history(e){return o.logAction(this.logger,o.LOG_MICRO,"RestChannel.history()","channel = "+this.name),this.client.rest.channelMixin.history(this,e)}async publish(...e){let t=e[0],n=e[1],i,s;if(typeof t=="string"||t===null)i=[Ye({name:t,data:n})],s=e[2];else if(me(t))i=[Ye(t)],s=e[1];else if(Array.isArray(t))i=vn(t),s=e[1];else throw new w("The single-argument form of publish() expects a message object or an array of message objects",40013,400);s||(s={});let r=this.client,l=r.options,u=l.useBinaryProtocol?"msgpack":"json",g=r.options.idempotentRestPublishing,f=U.defaultPostHeaders(r.options,{format:u});if(G(f,l.headers),g&&Io(i)){let O=await di(xo);i.forEach(function(R,I){R.id=O+":"+I.toString()})}await Hi(i,this.channelOptions);let b=_n(i),C=l.maxMessageSize;if(b>C)throw new w("Maximum size of messages that can be published at once exceeded ( was "+b+" bytes; limit is "+C+" bytes)",40009,400);await this._publish(Co(i,r._MsgPack,u),f,s)}async _publish(e,t,n){await oe.post(this.client,this.client.rest.channelMixin.basePath(this)+"/messages",e,t,n,null,!0)}async status(){return this.client.rest.channelMixin.status(this)}},Po=Eo,Lo=class xs{constructor(t){this.entries=t&&t.entries||void 0,this.schema=t&&t.schema||void 0,this.appId=t&&t.appId||void 0,this.inProgress=t&&t.inProgress||void 0,this.unit=t&&t.unit||void 0,this.intervalId=t&&t.intervalId||void 0}static fromValues(t){return new xs(t)}},Uo=Lo,Ki=class{static basePath(e){return"/channels/"+encodeURIComponent(e.name)}static history(e,t){let n=e.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=e.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),new qe(n,this.basePath(e)+"/messages",r,s,async function(l,u,g){let f=g?l:Ae(l,n._MsgPack,i);return bo(f,e)}).get(t)}static async status(e){let t=e.client.options.useBinaryProtocol?"msgpack":"json",n=U.defaultPostHeaders(e.client.options,{format:t});return(await oe.get(e.client,this.basePath(e),n,{},t,!0)).body}},No=class{static basePath(e){return Ki.basePath(e.channel)+"/presence"}static async history(e,t){let n=e.channel.client,i=n.options.useBinaryProtocol?"msgpack":"json",s=e.channel.client.http.supportsLinkHeaders?void 0:i,r=U.defaultGetHeaders(n.options,{format:i});return G(r,n.options.headers),new qe(n,this.basePath(e)+"/history",r,s,async(l,u,g)=>{let f=g?l:Ae(l,n._MsgPack,i);return Wi(f,e.channel)}).get(t)}},$i=class{constructor(e){this.channelMixin=Ki,this.presenceMixin=No,this.Resource=oe,this.DeviceDetails=Xe,this.client=e,this.channels=new Bo(this.client),this.push=new ho(this.client)}async stats(e){let t=U.defaultGetHeaders(this.client.options),n=this.client.options.useBinaryProtocol?"msgpack":"json",i=this.client.http.supportsLinkHeaders?void 0:n;return G(t,this.client.options.headers),new qe(this.client,"/stats",t,i,function(s,r,l){let u=l?s:JSON.parse(s);for(let g=0;g<u.length;g++)u[g]=Uo.fromValues(u[g]);return u}).get(e)}async time(e){let t=U.defaultGetHeaders(this.client.options);this.client.options.headers&&G(t,this.client.options.headers);let n=u=>this.client.baseUri(u)+"/time",{error:i,body:s,unpacked:r}=await this.client.http.do(Z.Get,n,t,null,e);if(i)throw i;r||(s=JSON.parse(s));let l=s[0];if(!l)throw new w("Internal error (unexpected result type from GET /time)",5e4,500);return this.client.serverTimeOffset=l-Date.now(),l}async request(e,t,n,i,s,r){var l;let[u,g,f]=this.client.options.useBinaryProtocol?(this.client._MsgPack||Ce("MsgPack"),[this.client._MsgPack.encode,this.client._MsgPack.decode,"msgpack"]):[JSON.stringify,JSON.parse,"json"],b=this.client.http.supportsLinkHeaders?void 0:f;i=i||{};let C=e.toLowerCase(),O=C=="get"?U.defaultGetHeaders(this.client.options,{format:f,protocolVersion:n}):U.defaultPostHeaders(this.client.options,{format:f,protocolVersion:n});typeof s!="string"&&(s=(l=u(s))!=null?l:null),G(O,this.client.options.headers),r&&G(O,r);let R=new qe(this.client,t,O,b,async function(I,x,L){return ct(L?I:g(I))},!0);if(!m.Http.methods.includes(C))throw new w("Unsupported method "+C,40500,405);return m.Http.methodsWithBody.includes(C)?R[C](i,s):R[C](i)}async batchPublish(e){let t,n;Array.isArray(e)?(t=e,n=!1):(t=[e],n=!0);let i=this.client.options.useBinaryProtocol?"msgpack":"json",s=U.defaultPostHeaders(this.client.options,{format:i});this.client.options.headers&&G(s,this.client.options.headers);let r=Me(t,this.client._MsgPack,i),l=await oe.post(this.client,"/messages",r,s,{},null,!0),u=l.unpacked?l.body:Ae(l.body,this.client._MsgPack,i);return n?u[0]:u}async batchPresence(e){let t=this.client.options.useBinaryProtocol?"msgpack":"json",n=U.defaultPostHeaders(this.client.options,{format:t});this.client.options.headers&&G(n,this.client.options.headers);let i=e.join(","),s=await oe.get(this.client,"/presence",n,{channels:i},null,!0);return s.unpacked?s.body:Ae(s.body,this.client._MsgPack,t)}async revokeTokens(e,t){if(Ei(this.client.options))throw new w("Cannot revoke tokens when using token auth",40162,401);let n=this.client.options.keyName,i=t??{},s=y({targets:e.map(f=>`${f.type}:${f.value}`)},i),r=this.client.options.useBinaryProtocol?"msgpack":"json",l=U.defaultPostHeaders(this.client.options,{format:r});this.client.options.headers&&G(l,this.client.options.headers);let u=Me(s,this.client._MsgPack,r),g=await oe.post(this.client,`/keys/${n}/revokeTokens`,u,l,{},null,!0);return g.unpacked?g.body:Ae(g.body,this.client._MsgPack,r)}},Bo=class{constructor(e){this.client=e,this.all=Object.create(null)}get(e,t){e=String(e);let n=this.all[e];return n?t&&n.setOptions(t):this.all[e]=n=new Po(this.client,e,t),n}release(e){delete this.all[String(e)]}},Go=class extends Li{constructor(e){super(U.objectifyOptions(e,!1,"BaseRest",o.defaultLogger,{Rest:$i}))}},Ji={Rest:$i},Qi=class extends Ro{static async fromEncoded(e,t){return Di(o.defaultLogger,m.Crypto,e,t)}static async fromEncodedArray(e,t){return vo(o.defaultLogger,m.Crypto,e,t)}static fromValues(e){return Ye(e)}static fromWireProtocol(e){return Dt(e)}static async encode(e,t){return yn(e,t)}static async decode(e,t){return ht(e,t)}},Xi=class extends So{static async fromEncoded(e,t){return ji(o.defaultLogger,m.Crypto,e,t)}static async fromEncodedArray(e,t){return Ao(o.defaultLogger,m.Crypto,e,t)}static fromValues(e){return Ne(e)}},Ze=class Kt extends Go{constructor(t){var n,i;if(!Kt._MsgPack)throw new Error("Expected DefaultRest._MsgPack to have been set");super(U.objectifyOptions(t,!0,"Rest",o.defaultLogger,E(y({},Ji),{Crypto:(n=Kt.Crypto)!=null?n:void 0,MsgPack:(i=Kt._MsgPack)!=null?i:void 0})))}static get Crypto(){if(this._Crypto===null)throw new Error("Encryption not enabled; use ably.encryption.js instead");return this._Crypto}static set Crypto(t){this._Crypto=t}};Ze._Crypto=null,Ze.Message=Qi,Ze.PresenceMessage=Xi,Ze._MsgPack=null,Ze._Http=gn;var Cn=Ze;function qo(e,t,n,i){try{n.apply(t,i)}catch(s){o.logAction(e,o.LOG_ERROR,"EventEmitter.emit()","Unexpected listener exception: "+s+"; stack = "+(s&&s.stack))}}function Rn(e,t,n){let i,s,r;for(let l=0;l<e.length;l++)if(i=e[l],n&&(i=i[n]),Array.isArray(i)){for(;(s=i.indexOf(t))!==-1;)i.splice(s,1);n&&i.length===0&&delete e[l][n]}else if(me(i))for(r in i)Object.prototype.hasOwnProperty.call(i,r)&&Array.isArray(i[r])&&Rn([i],t,r)}var Do=class{constructor(e){this.logger=e,this.any=[],this.events=Object.create(null),this.anyOnce=[],this.eventsOnce=Object.create(null)}on(...e){if(e.length===1){let t=e[0];if(typeof t=="function")this.any.push(t);else throw new Error("EventListener.on(): Invalid arguments: "+m.Config.inspect(e))}if(e.length===2){let[t,n]=e;if(typeof n!="function")throw new Error("EventListener.on(): Invalid arguments: "+m.Config.inspect(e));if(ye(t))this.any.push(n);else if(Array.isArray(t))t.forEach(i=>{this.on(i,n)});else{if(typeof t!="string")throw new Error("EventListener.on(): Invalid arguments: "+m.Config.inspect(e));(this.events[t]||(this.events[t]=[])).push(n)}}}off(...e){if(e.length==0||ye(e[0])&&ye(e[1])){this.any=[],this.events=Object.create(null),this.anyOnce=[],this.eventsOnce=Object.create(null);return}let[t,n]=e,i=null,s=null;if(e.length===1||!n)typeof t=="function"?i=t:s=t;else{if(typeof n!="function")throw new Error("EventEmitter.off(): invalid arguments:"+m.Config.inspect(e));[s,i]=[t,n]}if(i&&ye(s)){Rn([this.any,this.events,this.anyOnce,this.eventsOnce],i);return}if(Array.isArray(s)){s.forEach(r=>{this.off(r,i)});return}if(typeof s!="string")throw new Error("EventEmitter.off(): invalid arguments:"+m.Config.inspect(e));i?Rn([this.events,this.eventsOnce],i,s):(delete this.events[s],delete this.eventsOnce[s])}listeners(e){if(e){let t=this.events[e]||[];return this.eventsOnce[e]&&Array.prototype.push.apply(t,this.eventsOnce[e]),t.length?t:null}return this.any.length?this.any:null}emit(e,...t){let n={event:e},i=[];this.anyOnce.length&&(Array.prototype.push.apply(i,this.anyOnce),this.anyOnce=[]),this.any.length&&Array.prototype.push.apply(i,this.any);let s=this.eventsOnce[e];s&&(Array.prototype.push.apply(i,s),delete this.eventsOnce[e]);let r=this.events[e];r&&Array.prototype.push.apply(i,r),i.forEach(l=>{qo(this.logger,n,l,t)})}once(...e){let t=e.length;if(t===0||t===1&&typeof e[0]!="function"){let s=e[0];return new Promise(r=>{this.once(s,r)})}let[n,i]=e;if(e.length===1&&typeof n=="function")this.anyOnce.push(n);else if(ye(n)){if(typeof i!="function")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));this.anyOnce.push(i)}else if(Array.isArray(n)){let s=this,r=function(){let l=Array.prototype.slice.call(arguments);if(n.forEach(function(u){s.off(u,r)}),typeof i!="function")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));i.apply(this,l)};n.forEach(function(l){s.on(l,r)})}else{if(typeof n!="string")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));let s=this.eventsOnce[n]||(this.eventsOnce[n]=[]);if(i){if(typeof i!="function")throw new Error("EventEmitter.once(): Invalid arguments:"+m.Config.inspect(e));s.push(i)}}}async whenState(e,t){if(typeof e!="string"||typeof t!="string")throw new Error("whenState requires a valid state String argument");return e===t?null:this.once(e)}},de=Do,q={HEARTBEAT:0,ACK:1,NACK:2,CONNECT:3,CONNECTED:4,DISCONNECT:5,DISCONNECTED:6,CLOSE:7,CLOSED:8,ERROR:9,ATTACH:10,ATTACHED:11,DETACH:12,DETACHED:13,PRESENCE:14,MESSAGE:15,SYNC:16,AUTH:17,ACTIVATE:18},Yi=[];Object.keys(q).forEach(function(e){Yi[q[e]]=e});var Be={HAS_PRESENCE:1,HAS_BACKLOG:2,RESUMED:4,TRANSIENT:16,ATTACH_RESUME:32,PRESENCE:65536,PUBLISH:1<<17,SUBSCRIBE:1<<18,PRESENCE_SUBSCRIBE:1<<19},Ho=Object.keys(Be);Be.MODE_ALL=Be.PRESENCE|Be.PUBLISH|Be.SUBSCRIBE|Be.PRESENCE_SUBSCRIBE;function Zi(e){let t=[];if(e)for(let n=0;n<e.length;n++)t.push(e[n].toString());return"[ "+t.join(", ")+" ]"}var es=["PRESENCE","PUBLISH","SUBSCRIBE","PRESENCE_SUBSCRIBE"],Fo=Me;function jo(e,t,n,i){let s=Ae(e,t,i);return kn(s,n)}function kn(e,t){let n=e.error;n&&(e.error=w.fromValues(n));let i;e.messages&&(i=e.messages.map(l=>Dt(l)));let s;return t&&e.presence&&(s=e.presence.map(l=>t.presenceMessageFromWireProtocol(l))),Object.assign(new On,E(y({},e),{presence:s,messages:i}))}function Wo(e){return kn(e,{presenceMessageFromValues:Ne,presenceMessagesFromValuesArray:Vi,presenceMessageFromWireProtocol:Ht})}function xe(e){return Object.assign(new On,e)}function An(e,t){let n="[ProtocolMessage";e.action!==void 0&&(n+="; action="+Yi[e.action]||e.action);let i=["id","channel","channelSerial","connectionId","count","msgSerial","timestamp"],s;for(let r=0;r<i.length;r++)s=i[r],e[s]!==void 0&&(n+="; "+s+"="+e[s]);if(e.messages&&(n+="; messages="+Zi(vn(e.messages))),e.presence&&t&&(n+="; presence="+Zi(t.presenceMessagesFromValuesArray(e.presence))),e.error&&(n+="; error="+w.fromValues(e.error).toString()),e.auth&&e.auth.accessToken&&(n+="; token="+e.auth.accessToken),e.flags&&(n+="; flags="+Ho.filter(e.hasFlag).join(",")),e.params){let r="";N(e.params,function(l){r.length>0&&(r+="; "),r+=l+"="+e.params[l]}),r.length>0&&(n+="; params=["+r+"]")}return n+="]",n}var On=class{constructor(){this.hasFlag=e=>(this.flags&Be[e])>0}setFlag(e){return this.flags=this.flags|Be[e]}getMode(){return this.flags&&this.flags&Be.MODE_ALL}encodeModesToFlags(e){e.forEach(t=>this.setFlag(t))}decodeModesFromFlags(){let e=[];return es.forEach(t=>{this.hasFlag(t)&&e.push(t)}),e.length>0?e:void 0}},ts=On,Vo=class extends de{constructor(e){super(e),this.messages=[]}count(){return this.messages.length}push(e){this.messages.push(e)}shift(){return this.messages.shift()}last(){return this.messages[this.messages.length-1]}copyAll(){return this.messages.slice()}append(e){this.messages.push.apply(this.messages,e)}prepend(e){this.messages.unshift.apply(this.messages,e)}completeMessages(e,t,n){o.logAction(this.logger,o.LOG_MICRO,"MessageQueue.completeMessages()","serial = "+e+"; count = "+t),n=n||null;let i=this.messages;if(i.length===0)throw new Error("MessageQueue.completeMessages(): completeMessages called on any empty MessageQueue");let s=i[0];if(s){let r=s.message.msgSerial,l=e+t;if(l>r){let u=i.splice(0,l-r);for(let g of u)g.callback(n)}i.length==0&&this.emit("idle")}}completeAllMessages(e){this.completeMessages(0,Number.MAX_SAFE_INTEGER||Number.MAX_VALUE,e)}resetSendAttempted(){for(let e of this.messages)e.sendAttempted=!1}clear(){o.logAction(this.logger,o.LOG_MICRO,"MessageQueue.clear()","clearing "+this.messages.length+" messages"),this.messages=[],this.emit("idle")}},ns=Vo,is=class{constructor(e,t){this.message=e,this.callback=t,this.merged=!1;let n=e.action;this.sendAttempted=!1,this.ackRequired=n==q.MESSAGE||n==q.PRESENCE}},zo=class extends de{constructor(e){super(e.logger),this.transport=e,this.messageQueue=new ns(this.logger),e.on("ack",(t,n)=>{this.onAck(t,n)}),e.on("nack",(t,n,i)=>{this.onNack(t,n,i)})}onAck(e,t){o.logAction(this.logger,o.LOG_MICRO,"Protocol.onAck()","serial = "+e+"; count = "+t),this.messageQueue.completeMessages(e,t)}onNack(e,t,n){o.logAction(this.logger,o.LOG_ERROR,"Protocol.onNack()","serial = "+e+"; count = "+t+"; err = "+J(n)),n||(n=new w("Unable to send message; channel not responding",50001,500)),this.messageQueue.completeMessages(e,t,n)}onceIdle(e){let t=this.messageQueue;if(t.count()===0){e();return}t.once("idle",e)}send(e){e.ackRequired&&this.messageQueue.push(e),this.logger.shouldLog(o.LOG_MICRO)&&o.logActionNoStrip(this.logger,o.LOG_MICRO,"Protocol.send()","sending msg; "+An(e.message,this.transport.connectionManager.realtime._RealtimePresence)),e.sendAttempted=!0,this.transport.send(e.message)}getTransport(){return this.transport}getPendingMessages(){return this.messageQueue.copyAll()}clearPendingMessages(){return this.messageQueue.clear()}finish(){let e=this.transport;this.onceIdle(function(){e.disconnect()})}},Ko=zo,$o=class{constructor(e,t,n,i){this.previous=e,this.current=t,n&&(this.retryIn=n),i&&(this.reason=i)}},jt=$o,De={DISCONNECTED:80003,SUSPENDED:80002,FAILED:8e4,CLOSING:80017,CLOSED:80017,UNKNOWN_CONNECTION_ERR:50002,UNKNOWN_CHANNEL_ERR:50001},Jo={disconnected:()=>w.fromValues({statusCode:400,code:De.DISCONNECTED,message:"Connection to server temporarily unavailable"}),suspended:()=>w.fromValues({statusCode:400,code:De.SUSPENDED,message:"Connection to server unavailable"}),failed:()=>w.fromValues({statusCode:400,code:De.FAILED,message:"Connection failed or disconnected by server"}),closing:()=>w.fromValues({statusCode:400,code:De.CLOSING,message:"Connection closing"}),closed:()=>w.fromValues({statusCode:400,code:De.CLOSED,message:"Connection closed"}),unknownConnectionErr:()=>w.fromValues({statusCode:500,code:De.UNKNOWN_CONNECTION_ERR,message:"Internal connection error"}),unknownChannelErr:()=>w.fromValues({statusCode:500,code:De.UNKNOWN_CONNECTION_ERR,message:"Internal channel error"})};function Qo(e){return!e.statusCode||!e.code||e.statusCode>=500?!0:Object.values(De).includes(e.code)}var He=Jo,Xo=xe({action:q.CLOSE}),Yo=xe({action:q.DISCONNECT}),Zo=class extends de{constructor(e,t,n,i){super(e.logger),i&&(n.format=void 0,n.heartbeats=!0),this.connectionManager=e,this.auth=t,this.params=n,this.timeouts=n.options.timeouts,this.format=n.format,this.isConnected=!1,this.isFinished=!1,this.isDisposed=!1,this.maxIdleInterval=null,this.idleTimer=null,this.lastActivity=null}connect(){}close(){this.isConnected&&this.requestClose(),this.finish("closed",He.closed())}disconnect(e){this.isConnected&&this.requestDisconnect(),this.finish("disconnected",e||He.disconnected())}fail(e){this.isConnected&&this.requestDisconnect(),this.finish("failed",e||He.failed())}finish(e,t){var n;this.isFinished||(this.isFinished=!0,this.isConnected=!1,this.maxIdleInterval=null,clearTimeout((n=this.idleTimer)!=null?n:void 0),this.idleTimer=null,this.emit(e,t),this.dispose())}onProtocolMessage(e){switch(this.logger.shouldLog(o.LOG_MICRO)&&o.logActionNoStrip(this.logger,o.LOG_MICRO,"Transport.onProtocolMessage()","received on "+this.shortName+": "+An(e,this.connectionManager.realtime._RealtimePresence)+"; connectionId = "+this.connectionManager.connectionId),this.onActivity(),e.action){case q.HEARTBEAT:o.logActionNoStrip(this.logger,o.LOG_MICRO,"Transport.onProtocolMessage()",this.shortName+" heartbeat; connectionId = "+this.connectionManager.connectionId),this.emit("heartbeat",e.id);break;case q.CONNECTED:this.onConnect(e),this.emit("connected",e.error,e.connectionId,e.connectionDetails,e);break;case q.CLOSED:this.onClose(e);break;case q.DISCONNECTED:this.onDisconnect(e);break;case q.ACK:this.emit("ack",e.msgSerial,e.count);break;case q.NACK:this.emit("nack",e.msgSerial,e.count,e.error);break;case q.SYNC:this.connectionManager.onChannelMessage(e,this);break;case q.ACTIVATE:break;case q.AUTH:_e(this.auth.authorize(),t=>{t&&o.logAction(this.logger,o.LOG_ERROR,"Transport.onProtocolMessage()","Ably requested re-authentication, but unable to obtain a new token: "+J(t))});break;case q.ERROR:if(o.logAction(this.logger,o.LOG_MINOR,"Transport.onProtocolMessage()","received error action; connectionId = "+this.connectionManager.connectionId+"; err = "+m.Config.inspect(e.error)+(e.channel?", channel: "+e.channel:"")),e.channel===void 0){this.onFatalError(e);break}this.connectionManager.onChannelMessage(e,this);break;default:this.connectionManager.onChannelMessage(e,this)}}onConnect(e){if(this.isConnected=!0,!e.connectionDetails)throw new Error("Transport.onConnect(): Connect message recieved without connectionDetails");let t=e.connectionDetails.maxIdleInterval;t&&(this.maxIdleInterval=t+this.timeouts.realtimeRequestTimeout,this.onActivity())}onDisconnect(e){let t=e&&e.error;o.logAction(this.logger,o.LOG_MINOR,"Transport.onDisconnect()","err = "+J(t)),this.finish("disconnected",t)}onFatalError(e){let t=e&&e.error;o.logAction(this.logger,o.LOG_MINOR,"Transport.onFatalError()","err = "+J(t)),this.finish("failed",t)}onClose(e){let t=e&&e.error;o.logAction(this.logger,o.LOG_MINOR,"Transport.onClose()","err = "+J(t)),this.finish("closed",t)}requestClose(){o.logAction(this.logger,o.LOG_MINOR,"Transport.requestClose()",""),this.send(Xo)}requestDisconnect(){o.logAction(this.logger,o.LOG_MINOR,"Transport.requestDisconnect()",""),this.send(Yo)}ping(e){let t={action:q.HEARTBEAT};e&&(t.id=e),this.send(xe(t))}dispose(){o.logAction(this.logger,o.LOG_MINOR,"Transport.dispose()",""),this.isDisposed=!0,this.off()}onActivity(){this.maxIdleInterval&&(this.lastActivity=this.connectionManager.lastActivity=Date.now(),this.setIdleTimer(this.maxIdleInterval+100))}setIdleTimer(e){this.idleTimer||(this.idleTimer=setTimeout(()=>{this.onIdleTimerExpire()},e))}onIdleTimerExpire(){if(!this.lastActivity||!this.maxIdleInterval)throw new Error("Transport.onIdleTimerExpire(): lastActivity/maxIdleInterval not set");this.idleTimer=null;let e=Date.now()-this.lastActivity,t=this.maxIdleInterval-e;if(t<=0){let n="No activity seen from realtime in "+e+"ms; assuming connection has dropped";o.logAction(this.logger,o.LOG_ERROR,"Transport.onIdleTimerExpire()",n),this.disconnect(new w(n,80003,408))}else this.setIdleTimer(t+100)}static tryConnect(e,t,n,i,s){let r=new e(t,n,i),l,u=function(f){clearTimeout(l),s({event:this.event,error:f})},g=t.options.timeouts.realtimeRequestTimeout;return l=setTimeout(()=>{r.off(["preconnect","disconnected","failed"]),r.dispose(),u.call({event:"disconnected"},new w("Timeout waiting for transport to indicate itself viable",5e4,500))},g),r.on(["failed","disconnected"],u),r.on("preconnect",function(){o.logAction(t.logger,o.LOG_MINOR,"Transport.tryConnect()","viable transport "+r),clearTimeout(l),r.off(["failed","disconnected"],u),s(null,r)}),r.connect(),r}static isAvailable(){throw new w("isAvailable not implemented for transport",5e4,500)}},et=Zo,be;(e=>{e.WebSocket="web_socket",e.Comet="comet",e.XhrPolling="xhr_polling"})(be||(be={}));var ea=typeof global<"u"?global:typeof window<"u"?window:self,Sn=()=>{var e;return typeof m.WebStorage<"u"&&((e=m.WebStorage)==null?void 0:e.localSupported)},ut=()=>{var e;return typeof m.WebStorage<"u"&&((e=m.WebStorage)==null?void 0:e.sessionSupported)},ss=function(){},Tn="ably-transport-preference";function ta(e,t,n){let i;if(e.channel!==t.channel||(i=e.action)!==q.PRESENCE&&i!==q.MESSAGE||i!==t.action)return!1;let s=i===q.PRESENCE?"presence":"messages",r=e[s].concat(t[s]);return _n(r)>n||!X(r,"clientId")||!r.every(function(u){return!u.id})?!1:(e[s]=r,!0)}function Mn(e){try{return JSON.parse(e)}catch{return null}}var na=class{constructor(e,t,n,i){this.options=e,this.host=t,this.mode=n,this.connectionKey=i,this.format=e.useBinaryProtocol?"msgpack":"json"}getConnectParams(e){let t=e?ge(e):{},n=this.options;switch(this.mode){case"resume":t.resume=this.connectionKey;break;case"recover":{let i=Mn(n.recover);i&&(t.recover=i.connectionKey);break}default:}return n.clientId!==void 0&&(t.clientId=n.clientId),n.echoMessages===!1&&(t.echo="false"),this.format!==void 0&&(t.format=this.format),this.stream!==void 0&&(t.stream=this.stream),this.heartbeats!==void 0&&(t.heartbeats=this.heartbeats),t.v=U.protocolVersion,t.agent=un(this.options),n.transportParams!==void 0&&G(t,n.transportParams),t}toString(){let e="[mode="+this.mode;return this.host&&(e+=",host="+this.host),this.connectionKey&&(e+=",connectionKey="+this.connectionKey),this.format&&(e+=",format="+this.format),e+="]",e}},ia=class Is extends de{constructor(t,n){super(t.logger),this.supportedTransports={},this.disconnectedRetryCount=0,this.pendingChannelMessagesState={isProcessing:!1,queue:[]},this.realtime=t,this.initTransports(),this.options=n;let i=n.timeouts,s=i.webSocketConnectTimeout+i.realtimeRequestTimeout;if(this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1,failState:"disconnected"},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:s,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},disconnected:{state:"disconnected",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:i.disconnectedRetryTimeout,failState:"disconnected"},suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:i.suspendedRetryTimeout,failState:"suspended"},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:i.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"closed"},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1,failState:"failed"}},this.state=this.states.initialized,this.errorReason=null,this.queuedMessages=new ns(this.logger),this.msgSerial=0,this.connectionDetails=void 0,this.connectionId=void 0,this.connectionKey=void 0,this.connectionStateTtl=i.connectionStateTtl,this.maxIdleInterval=null,this.transports=xt(n.transports||U.defaultTransports,this.supportedTransports),this.transportPreference=null,this.transports.includes(be.WebSocket)&&(this.webSocketTransportAvailable=!0),this.transports.includes(be.XhrPolling)?this.baseTransport=be.XhrPolling:this.transports.includes(be.Comet)&&(this.baseTransport=be.Comet),this.httpHosts=U.getHosts(n),this.wsHosts=U.getHosts(n,!0),this.activeProtocol=null,this.host=null,this.lastAutoReconnectAttempt=null,this.lastActivity=null,this.forceFallbackHost=!1,this.connectCounter=0,this.wsCheckResult=null,this.webSocketSlowTimer=null,this.webSocketGiveUpTimer=null,this.abandonedWebSocket=!1,o.logAction(this.logger,o.LOG_MINOR,"Realtime.ConnectionManager()","started"),o.logAction(this.logger,o.LOG_MICRO,"Realtime.ConnectionManager()","requested transports = ["+(n.transports||U.defaultTransports)+"]"),o.logAction(this.logger,o.LOG_MICRO,"Realtime.ConnectionManager()","available transports = ["+this.transports+"]"),o.logAction(this.logger,o.LOG_MICRO,"Realtime.ConnectionManager()","http hosts = ["+this.httpHosts+"]"),!this.transports.length){let l="no requested transports available";throw o.logAction(this.logger,o.LOG_ERROR,"realtime.ConnectionManager()",l),new Error(l)}let r=m.Config.addEventListener;r&&(ut()&&typeof n.recover=="function"&&r("beforeunload",this.persistConnection.bind(this)),n.closeOnUnload===!0&&r("beforeunload",()=>{o.logAction(this.logger,o.LOG_MAJOR,"Realtime.ConnectionManager()","beforeunload event has triggered the connection to close as closeOnUnload is true"),this.requestState({state:"closing"})}),r("online",()=>{var l;this.state==this.states.disconnected||this.state==this.states.suspended?(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager caught browser \u2018online\u2019 event","reattempting connection"),this.requestState({state:"connecting"})):this.state==this.states.connecting&&((l=this.pendingTransport)==null||l.off(),this.disconnectAllTransports(),this.startConnect())}),r("offline",()=>{this.state==this.states.connected&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager caught browser \u2018offline\u2019 event","disconnecting active transport"),this.disconnectAllTransports())}))}static supportedTransports(t){let n={supportedTransports:{}};return this.initTransports(t,n),n.supportedTransports}static initTransports(t,n){let i=y(y({},m.Transports.bundledImplementations),t);[be.WebSocket,...m.Transports.order].forEach(s=>{let r=i[s];r&&r.isAvailable()&&(n.supportedTransports[s]=r)})}initTransports(){Is.initTransports(this.realtime._additionalTransportImplementations,this)}createTransportParams(t,n){return new na(this.options,t,n,this.connectionKey)}getTransportParams(t){(i=>{if(this.connectionKey){i("resume");return}if(typeof this.options.recover=="string"){i("recover");return}let s=this.options.recover,r=this.getSessionRecoverData(),l=this.sessionRecoveryName();if(r&&typeof s=="function"){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.getTransportParams()","Calling clientOptions-provided recover function with last session data (recovery scope: "+l+")"),s(r,u=>{u?(this.options.recover=r.recoveryKey,i("recover")):i("clean")});return}i("clean")})(i=>{let s=this.createTransportParams(null,i);if(i==="recover"){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.getTransportParams()","Transport recovery mode = recover; recoveryKey = "+this.options.recover);let r=Mn(this.options.recover);r&&(this.msgSerial=r.msgSerial)}else o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.getTransportParams()","Transport params = "+s.toString());t(s)})}tryATransport(t,n,i){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.tryATransport()","trying "+n),this.proposedTransport=et.tryConnect(this.supportedTransports[n],this,this.realtime.auth,t,(s,r)=>{let l=this.state;if(l==this.states.closing||l==this.states.closed||l==this.states.failed){r&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.tryATransport()","connection "+l.state+" while we were attempting the transport; closing "+r),r.close()),i(!0);return}if(s){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.tryATransport()","transport "+n+" "+s.event+", err: "+s.error.toString()),Ue.isTokenErr(s.error)&&!(this.errorReason&&Ue.isTokenErr(this.errorReason))?(this.errorReason=s.error,_e(this.realtime.auth._forceNewToken(null,null),u=>{if(u){this.actOnErrorFromAuthorize(u);return}this.tryATransport(t,n,i)})):s.event==="failed"?(this.notifyState({state:"failed",error:s.error}),i(!0)):s.event==="disconnected"&&(Qo(s.error)?i(!1):(this.notifyState({state:this.states.connecting.failState,error:s.error}),i(!0)));return}o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.tryATransport()","viable transport "+n+"; setting pending"),this.setTransportPending(r,t),i(null,r)})}setTransportPending(t,n){let i=n.mode;o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.setTransportPending()","transport = "+t+"; mode = "+i),this.pendingTransport=t,this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),t.once("connected",(r,l,u)=>{this.activateTransport(r,t,l,u),i==="recover"&&this.options.recover&&(delete this.options.recover,this.unpersistConnection())});let s=this;t.on(["disconnected","closed","failed"],function(r){s.deactivateTransport(t,this.event,r)}),this.emit("transport.pending",t)}activateTransport(t,n,i,s){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","transport = "+n),t&&o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.activateTransport()","error = "+t),i&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.activateTransport()","connectionId = "+i),s&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.activateTransport()","connectionDetails = "+JSON.stringify(s)),this.persistTransportPreference(n);let r=this.state,l=this.states.connected.state;if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","current state = "+r.state),r.state==this.states.closing.state||r.state==this.states.closed.state||r.state==this.states.failed.state)return o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","Disconnecting transport and abandoning"),n.disconnect(),!1;if(delete this.pendingTransport,!n.isConnected)return o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.activateTransport()","Declining to activate transport "+n+" since it appears to no longer be connected"),!1;let u=this.activeProtocol;this.activeProtocol=new Ko(n),this.host=n.params.host;let g=s.connectionKey;if(g&&this.connectionKey!=g&&this.setConnection(i,s,!!t),this.onConnectionDetailsUpdate(s,n),m.Config.nextTick(()=>{n.on("connected",(f,b,C)=>{this.onConnectionDetailsUpdate(C,n),this.emit("update",new jt(l,l,null,f))})}),r.state===this.states.connected.state?t&&(this.errorReason=this.realtime.connection.errorReason=t,this.emit("update",new jt(l,l,null,t))):(this.notifyState({state:"connected",error:t}),this.errorReason=this.realtime.connection.errorReason=t||null),this.emit("transport.active",n),u)if(u.messageQueue.count()>0&&o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.activateTransport()","Previous active protocol (for transport "+u.transport.shortName+", new one is "+n.shortName+") finishing with "+u.messageQueue.count()+" messages still pending"),u.transport===n){let f="Assumption violated: activating a transport that was also the transport for the previous active protocol; transport = "+n.shortName+"; stack = "+new Error().stack;o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.activateTransport()",f)}else u.finish();return!0}deactivateTransport(t,n,i){let s=this.activeProtocol,r=s&&s.getTransport()===t,l=t===this.pendingTransport,u=this.noTransportsScheduledForActivation();if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.deactivateTransport()","transport = "+t),o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.deactivateTransport()","state = "+n+(r?"; was active":l?"; was pending":"")+(u?"":"; another transport is scheduled for activation")),i&&i.message&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.deactivateTransport()","reason = "+i.message),r&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.deactivateTransport()","Getting, clearing, and requeuing "+this.activeProtocol.messageQueue.count()+" pending messages"),this.queuePendingMessages(s.getPendingMessages()),s.clearPendingMessages(),this.activeProtocol=this.host=null),this.emit("transport.inactive",t),r&&u||r&&n==="failed"||n==="closed"||s===null&&l){if(n==="disconnected"&&i&&i.statusCode>500&&this.httpHosts.length>1){this.unpersistTransportPreference(),this.forceFallbackHost=!0,this.notifyState({state:n,error:i,retryImmediately:!0});return}let g=n==="failed"&&Ue.isTokenErr(i)?"disconnected":n;this.notifyState({state:g,error:i});return}}noTransportsScheduledForActivation(){return!this.pendingTransport||!this.pendingTransport.isConnected}setConnection(t,n,i){let s=this.connectionId;(s&&s!==t||!s&&i)&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.setConnection()","Resetting msgSerial"),this.msgSerial=0,this.queuedMessages.resetSendAttempted()),this.connectionId!==t&&o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.setConnection()","New connectionId; reattaching any attached channels"),this.realtime.connection.id=this.connectionId=t,this.realtime.connection.key=this.connectionKey=n.connectionKey}clearConnection(){this.realtime.connection.id=this.connectionId=void 0,this.realtime.connection.key=this.connectionKey=void 0,this.msgSerial=0,this.unpersistConnection()}createRecoveryKey(){return this.connectionKey?JSON.stringify({connectionKey:this.connectionKey,msgSerial:this.msgSerial,channelSerials:this.realtime.channels.channelSerials()}):null}checkConnectionStateFreshness(){if(!this.lastActivity||!this.connectionId)return;let t=Date.now()-this.lastActivity;t>this.connectionStateTtl+this.maxIdleInterval&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.checkConnectionStateFreshness()","Last known activity from realtime was "+t+"ms ago; discarding connection state"),this.clearConnection(),this.states.connecting.failState="suspended")}persistConnection(){if(ut()){let t=this.createRecoveryKey();t&&this.setSessionRecoverData({recoveryKey:t,disconnectedAt:Date.now(),location:ea.location,clientId:this.realtime.auth.clientId})}}unpersistConnection(){this.clearSessionRecoverData()}getError(){if(this.errorReason){let t=ce.fromValues(this.errorReason);return t.cause=this.errorReason,t}return this.getStateError()}getStateError(){var t,n;return(n=(t=He)[this.state.state])==null?void 0:n.call(t)}activeState(){return this.state.queueEvents||this.state.sendEvents}enactStateChange(t){let n="Connection state",i=t.current+(t.reason?"; reason: "+t.reason:"");t.current==="failed"?o.logAction(this.logger,o.LOG_ERROR,n,i):o.logAction(this.logger,o.LOG_MAJOR,n,i),o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.enactStateChange","setting new state: "+t.current+"; reason = "+(t.reason&&t.reason.message));let s=this.state=this.states[t.current];t.reason&&(this.errorReason=t.reason,this.realtime.connection.errorReason=t.reason),(s.terminal||s.state==="suspended")&&this.clearConnection(),this.emit("connectionstate",t)}startTransitionTimer(t){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startTransitionTimer()","transitionState: "+t.state),this.transitionTimer&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startTransitionTimer()","clearing already-running timer"),clearTimeout(this.transitionTimer)),this.transitionTimer=setTimeout(()=>{this.transitionTimer&&(this.transitionTimer=null,o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager "+t.state+" timer expired","requesting new state: "+t.failState),this.notifyState({state:t.failState}))},t.retryDelay)}cancelTransitionTimer(){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.cancelTransitionTimer()",""),this.transitionTimer&&(clearTimeout(this.transitionTimer),this.transitionTimer=null)}startSuspendTimer(){this.suspendTimer||(this.suspendTimer=setTimeout(()=>{this.suspendTimer&&(this.suspendTimer=null,o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager suspend timer expired","requesting new state: suspended"),this.states.connecting.failState="suspended",this.notifyState({state:"suspended"}))},this.connectionStateTtl))}checkSuspendTimer(t){t!=="disconnected"&&t!=="suspended"&&t!=="connecting"&&this.cancelSuspendTimer()}cancelSuspendTimer(){this.states.connecting.failState="disconnected",this.suspendTimer&&(clearTimeout(this.suspendTimer),this.suspendTimer=null)}startRetryTimer(t){this.retryTimer=setTimeout(()=>{o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager retry timer expired","retrying"),this.retryTimer=null,this.requestState({state:"connecting"})},t)}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}startWebSocketSlowTimer(){this.webSocketSlowTimer=setTimeout(()=>{o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket slow timer","checking connectivity"),this.checkWsConnectivity().then(()=>{o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket slow timer","ws connectivity check succeeded"),this.wsCheckResult=!0}).catch(()=>{o.logAction(this.logger,o.LOG_MAJOR,"ConnectionManager WebSocket slow timer","ws connectivity check failed"),this.wsCheckResult=!1}),this.realtime.http.checkConnectivity&&_e(this.realtime.http.checkConnectivity(),(t,n)=>{t||!n?(o.logAction(this.logger,o.LOG_MAJOR,"ConnectionManager WebSocket slow timer","http connectivity check failed"),this.cancelWebSocketGiveUpTimer(),this.notifyState({state:"disconnected",error:new w("Unable to connect (network unreachable)",80003,404)})):o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket slow timer","http connectivity check succeeded")})},this.options.timeouts.webSocketSlowTimeout)}cancelWebSocketSlowTimer(){this.webSocketSlowTimer&&(clearTimeout(this.webSocketSlowTimer),this.webSocketSlowTimer=null)}startWebSocketGiveUpTimer(t){this.webSocketGiveUpTimer=setTimeout(()=>{var n,i;this.wsCheckResult||(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager WebSocket give up timer","websocket connection took more than 10s; "+(this.baseTransport?"trying base transport":"")),this.baseTransport?(this.abandonedWebSocket=!0,(n=this.proposedTransport)==null||n.dispose(),(i=this.pendingTransport)==null||i.dispose(),this.connectBase(t,++this.connectCounter)):o.logAction(this.logger,o.LOG_MAJOR,"ConnectionManager WebSocket give up timer","websocket connectivity appears to be unavailable but no other transports to try"))},this.options.timeouts.webSocketConnectTimeout)}cancelWebSocketGiveUpTimer(){this.webSocketGiveUpTimer&&(clearTimeout(this.webSocketGiveUpTimer),this.webSocketGiveUpTimer=null)}notifyState(t){var n,i;let s=t.state,r=s==="disconnected"&&(this.state===this.states.connected||t.retryImmediately||this.state===this.states.connecting&&t.error&&Ue.isTokenErr(t.error)&&!(this.errorReason&&Ue.isTokenErr(this.errorReason)));if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.notifyState()","new state: "+s+(r?"; will retry connection immediately":"")),s==this.state.state||(this.cancelTransitionTimer(),this.cancelRetryTimer(),this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.checkSuspendTimer(t.state),(s==="suspended"||s==="connected")&&(this.disconnectedRetryCount=0),this.state.terminal))return;let l=this.states[t.state],u=l.retryDelay;l.state==="disconnected"&&(this.disconnectedRetryCount++,u=ln(l.retryDelay,this.disconnectedRetryCount));let g=new jt(this.state.state,l.state,u,t.error||((i=(n=He)[l.state])==null?void 0:i.call(n)));if(r){let f=()=>{this.state===this.states.disconnected&&(this.lastAutoReconnectAttempt=Date.now(),this.requestState({state:"connecting"}))},b=this.lastAutoReconnectAttempt&&Date.now()-this.lastAutoReconnectAttempt+1;b&&b<1e3?(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.notifyState()","Last reconnect attempt was only "+b+"ms ago, waiting another "+(1e3-b)+"ms before trying again"),setTimeout(f,1e3-b)):m.Config.nextTick(f)}else(s==="disconnected"||s==="suspended")&&this.startRetryTimer(u);(s==="disconnected"&&!r||s==="suspended"||l.terminal)&&m.Config.nextTick(()=>{this.disconnectAllTransports()}),s=="connected"&&!this.activeProtocol&&o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.notifyState()","Broken invariant: attempted to go into connected state, but there is no active protocol"),this.enactStateChange(g),this.state.sendEvents?this.sendQueuedMessages():this.state.queueEvents||(this.realtime.channels.propogateConnectionInterruption(s,g.reason),this.failQueuedMessages(g.reason))}requestState(t){var n,i;let s=t.state;if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.requestState()","requested state: "+s+"; current state: "+this.state.state),s==this.state.state||(this.cancelWebSocketSlowTimer(),this.cancelWebSocketGiveUpTimer(),this.cancelTransitionTimer(),this.cancelRetryTimer(),this.checkSuspendTimer(s),s=="connecting"&&this.state.state=="connected")||s=="closing"&&this.state.state=="closed")return;let r=this.states[s],l=new jt(this.state.state,r.state,null,t.error||((i=(n=He)[r.state])==null?void 0:i.call(n)));this.enactStateChange(l),s=="connecting"&&m.Config.nextTick(()=>{this.startConnect()}),s=="closing"&&this.closeImpl()}startConnect(){if(this.state!==this.states.connecting){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startConnect()","Must be in connecting state to connect, but was "+this.state.state);return}let t=this.realtime.auth,n=++this.connectCounter,i=()=>{this.checkConnectionStateFreshness(),this.getTransportParams(s=>{if(s.mode==="recover"&&s.options.recover){let r=Mn(s.options.recover);r&&this.realtime.channels.recoverChannels(r.channelSerials)}n===this.connectCounter&&this.connectImpl(s,n)})};if(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.startConnect()","starting connection"),this.startSuspendTimer(),this.startTransitionTimer(this.states.connecting),t.method==="basic")i();else{let s=r=>{n===this.connectCounter&&(r?this.actOnErrorFromAuthorize(r):i())};this.errorReason&&Ue.isTokenErr(this.errorReason)?_e(t._forceNewToken(null,null),s):_e(t._ensureValidAuthCredentials(!1),s)}}connectImpl(t,n){let i=this.state.state;if(i!==this.states.connecting.state){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.connectImpl()","Must be in connecting state to connect, but was "+i);return}let s=this.getTransportPreference();s&&s===this.baseTransport&&this.webSocketTransportAvailable&&this.checkWsConnectivity().then(()=>{this.unpersistTransportPreference(),this.state===this.states.connecting&&(o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.connectImpl():","web socket connectivity available, cancelling connection attempt with "+this.baseTransport),this.disconnectAllTransports(),this.connectWs(t,++this.connectCounter))}).catch(ss),s&&s===this.baseTransport||this.baseTransport&&!this.webSocketTransportAvailable?this.connectBase(t,n):this.connectWs(t,n)}connectWs(t,n){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.connectWs()"),this.wsCheckResult=null,this.abandonedWebSocket=!1,this.startWebSocketSlowTimer(),this.startWebSocketGiveUpTimer(t),this.tryTransportWithFallbacks("web_socket",t,!0,n,()=>this.wsCheckResult!==!1&&!this.abandonedWebSocket)}connectBase(t,n){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.connectBase()"),this.baseTransport?this.tryTransportWithFallbacks(this.baseTransport,t,!1,n,()=>!0):this.notifyState({state:"disconnected",error:new w("No transports left to try",8e4,404)})}tryTransportWithFallbacks(t,n,i,s,r){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.tryTransportWithFallbacks()",t);let l=C=>{this.notifyState({state:this.states.connecting.failState,error:C})},u=i?this.wsHosts.slice():this.httpHosts.slice(),g=(C,O)=>{if(s===this.connectCounter){if(!r()){O&&O.dispose();return}!O&&!C&&b()}},f=u.shift();if(!f){l(new w("Unable to connect (no available host)",80003,404));return}n.host=f;let b=()=>{if(!u.length){l(new w("Unable to connect (and no more fallback hosts to try)",80003,404));return}if(!this.realtime.http.checkConnectivity){l(new ce("Internal error: Http.checkConnectivity not set",null,500));return}_e(this.realtime.http.checkConnectivity(),(C,O)=>{if(s===this.connectCounter&&r()){if(C){l(C);return}if(!O){l(new w("Unable to connect (network unreachable)",80003,404));return}n.host=Y(u),this.tryATransport(n,t,g)}})};if(this.forceFallbackHost&&u.length){this.forceFallbackHost=!1,b();return}this.tryATransport(n,t,g)}closeImpl(){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.closeImpl()","closing connection"),this.cancelSuspendTimer(),this.startTransitionTimer(this.states.closing),this.pendingTransport&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.closeImpl()","Closing pending transport: "+this.pendingTransport),this.pendingTransport.close()),this.activeProtocol&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.closeImpl()","Closing active transport: "+this.activeProtocol.getTransport()),this.activeProtocol.getTransport().close()),this.notifyState({state:"closed"})}onAuthUpdated(t,n){var i;switch(this.state.state){case"connected":{o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.onAuthUpdated()","Sending AUTH message on active transport");let s=(i=this.activeProtocol)==null?void 0:i.getTransport();s&&s.onAuthUpdated&&s.onAuthUpdated(t);let r=xe({action:q.AUTH,auth:{accessToken:t.token}});this.send(r);let l=()=>{this.off(u),n(null,t)},u=g=>{g.current==="failed"&&(this.off(l),this.off(u),n(g.reason||this.getStateError()))};this.once("connectiondetails",l),this.on("connectionstate",u);break}case"connecting":o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.onAuthUpdated()","Aborting current connection attempts in order to start again with the new auth details"),this.disconnectAllTransports();default:{o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.onAuthUpdated()","Connection state is "+this.state.state+"; waiting until either connected or failed");let s=r=>{switch(r.current){case"connected":this.off(s),n(null,t);break;case"failed":case"closed":case"suspended":this.off(s),n(r.reason||this.getStateError());break;default:break}};this.on("connectionstate",s),this.state.state==="connecting"?this.startConnect():this.requestState({state:"connecting"})}}}disconnectAllTransports(){o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.disconnectAllTransports()","Disconnecting all transports"),this.connectCounter++,this.pendingTransport&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.disconnectAllTransports()","Disconnecting pending transport: "+this.pendingTransport),this.pendingTransport.disconnect()),delete this.pendingTransport,this.proposedTransport&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.disconnectAllTransports()","Disconnecting proposed transport: "+this.pendingTransport),this.proposedTransport.disconnect()),delete this.pendingTransport,this.activeProtocol&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.disconnectAllTransports()","Disconnecting active transport: "+this.activeProtocol.getTransport()),this.activeProtocol.getTransport().disconnect())}send(t,n,i){i=i||ss;let s=this.state;if(s.sendEvents){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.send()","sending event"),this.sendImpl(new is(t,i));return}if(!(n&&s.queueEvents)){let l="rejecting event, queueEvent was "+n+", state was "+s.state;o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.send()",l),i(this.errorReason||new w(l,9e4,400));return}this.logger.shouldLog(o.LOG_MICRO)&&o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.send()","queueing msg; "+An(t,this.realtime._RealtimePresence)),this.queue(t,i)}sendImpl(t){let n=t.message;t.ackRequired&&!t.sendAttempted&&(n.msgSerial=this.msgSerial++);try{this.activeProtocol.send(t)}catch(i){o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.sendImpl()","Unexpected exception in transport.send(): "+i.stack)}}queue(t,n){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.queue()","queueing event");let i=this.queuedMessages.last(),s=this.options.maxMessageSize;i&&!i.sendAttempted&&ta(i.message,t,s)?(i.merged||(i.callback=dn.create(this.logger,[i.callback]),i.merged=!0),i.callback.push(n)):this.queuedMessages.push(new is(t,n))}sendQueuedMessages(){o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.sendQueuedMessages()","sending "+this.queuedMessages.count()+" queued messages");let t;for(;t=this.queuedMessages.shift();)this.sendImpl(t)}queuePendingMessages(t){t&&t.length&&(o.logAction(this.logger,o.LOG_MICRO,"ConnectionManager.queuePendingMessages()","queueing "+t.length+" pending messages"),this.queuedMessages.prepend(t))}failQueuedMessages(t){let n=this.queuedMessages.count();n>0&&(o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.failQueuedMessages()","failing "+n+" queued messages, err = "+J(t)),this.queuedMessages.completeAllMessages(t))}onChannelMessage(t,n){this.pendingChannelMessagesState.queue.push({message:t,transport:n}),this.pendingChannelMessagesState.isProcessing||this.processNextPendingChannelMessage()}processNextPendingChannelMessage(){if(this.pendingChannelMessagesState.queue.length>0){this.pendingChannelMessagesState.isProcessing=!0;let t=this.pendingChannelMessagesState.queue.shift();this.processChannelMessage(t.message).catch(n=>{o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.processNextPendingChannelMessage() received error ",n)}).finally(()=>{this.pendingChannelMessagesState.isProcessing=!1,this.processNextPendingChannelMessage()})}}async processChannelMessage(t){await this.realtime.channels.processChannelMessage(t)}async ping(){var t;if(this.state.state!=="connected")throw new w("Unable to ping service; not connected",4e4,400);let n=(t=this.activeProtocol)==null?void 0:t.getTransport();if(!n)throw this.getStateError();o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.ping()","transport = "+n);let i=Date.now(),s=Lt();return bi(new Promise(r=>{let l=u=>{u===s&&(n.off("heartbeat",l),r(Date.now()-i))};n.on("heartbeat",l),n.ping(s)}),this.options.timeouts.realtimeRequestTimeout,"Timeout waiting for heartbeat response")}abort(t){this.activeProtocol.getTransport().fail(t)}getTransportPreference(){var t,n;return this.transportPreference||Sn()&&((n=(t=m.WebStorage)==null?void 0:t.get)==null?void 0:n.call(t,Tn))}persistTransportPreference(t){var n,i;this.transportPreference=t.shortName,Sn()&&((i=(n=m.WebStorage)==null?void 0:n.set)==null||i.call(n,Tn,t.shortName))}unpersistTransportPreference(){var t,n;this.transportPreference=null,Sn()&&((n=(t=m.WebStorage)==null?void 0:t.remove)==null||n.call(t,Tn))}actOnErrorFromAuthorize(t){if(t.code===40171)this.notifyState({state:"failed",error:t});else if(t.code===40102)this.notifyState({state:"failed",error:t});else if(t.statusCode===qt.Forbidden){let n="Client configured authentication provider returned 403; failing the connection";o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.actOnErrorFromAuthorize()",n),this.notifyState({state:"failed",error:new w(n,80019,403,t)})}else{let n="Client configured authentication provider request failed";o.logAction(this.logger,o.LOG_MINOR,"ConnectionManager.actOnErrorFromAuthorize",n),this.notifyState({state:this.state.failState,error:new w(n,80019,401,t)})}}onConnectionDetailsUpdate(t,n){if(!t)return;this.connectionDetails=t,t.maxMessageSize&&(this.options.maxMessageSize=t.maxMessageSize);let i=t.clientId;if(i){let r=this.realtime.auth._uncheckedSetClientId(i);if(r){o.logAction(this.logger,o.LOG_ERROR,"ConnectionManager.onConnectionDetailsUpdate()",r.message),n.fail(r);return}}let s=t.connectionStateTtl;s&&(this.connectionStateTtl=s),this.maxIdleInterval=t.maxIdleInterval,this.emit("connectiondetails",t)}checkWsConnectivity(){let t=this.options.wsConnectivityCheckUrl||U.wsConnectivityCheckUrl,n=new m.Config.WebSocket(t);return new Promise((i,s)=>{let r=!1;n.onopen=()=>{r||(r=!0,i(),n.close())},n.onclose=n.onerror=()=>{r||(r=!0,s())}})}sessionRecoveryName(){return this.options.recoveryKeyStorageName||"ably-connection-recovery"}getSessionRecoverData(){var t,n;return ut()&&((n=(t=m.WebStorage)==null?void 0:t.getSession)==null?void 0:n.call(t,this.sessionRecoveryName()))}setSessionRecoverData(t){var n,i;return ut()&&((i=(n=m.WebStorage)==null?void 0:n.setSession)==null?void 0:i.call(n,this.sessionRecoveryName(),t))}clearSessionRecoverData(){var t,n;return ut()&&((n=(t=m.WebStorage)==null?void 0:t.removeSession)==null?void 0:n.call(t,this.sessionRecoveryName()))}},rs=ia,sa=class extends de{constructor(e,t){super(e.logger),this.whenState=n=>de.prototype.whenState.call(this,n,this.state),this.ably=e,this.connectionManager=new rs(e,t),this.state=this.connectionManager.state.state,this.key=void 0,this.id=void 0,this.errorReason=null,this.connectionManager.on("connectionstate",n=>{let i=this.state=n.current;m.Config.nextTick(()=>{this.emit(i,n)})}),this.connectionManager.on("update",n=>{m.Config.nextTick(()=>{this.emit("update",n)})})}connect(){o.logAction(this.logger,o.LOG_MINOR,"Connection.connect()",""),this.connectionManager.requestState({state:"connecting"})}async ping(){return o.logAction(this.logger,o.LOG_MINOR,"Connection.ping()",""),this.connectionManager.ping()}close(){o.logAction(this.logger,o.LOG_MINOR,"Connection.close()","connectionKey = "+this.key),this.connectionManager.requestState({state:"closing"})}get recoveryKey(){return this.logger.deprecationWarning("The `Connection.recoveryKey` attribute has been replaced by the `Connection.createRecoveryKey()` method. Replace your usage of `recoveryKey` with the return value of `createRecoveryKey()`. `recoveryKey` will be removed in a future version."),this.createRecoveryKey()}createRecoveryKey(){return this.connectionManager.createRecoveryKey()}},ra=sa,oa=class{constructor(e,t,n,i,s){this.previous=e,this.current=t,t==="attached"&&(this.resumed=n,this.hasBacklog=i),s&&(this.reason=s)}},xn=oa,os=function(){};function aa(e){if(e&&"params"in e&&!me(e.params))return new w("options.params must be an object",4e4,400);if(e&&"modes"in e){if(!Array.isArray(e.modes))return new w("options.modes must be an array",4e4,400);for(let t=0;t<e.modes.length;t++){let n=e.modes[t];if(!n||typeof n!="string"||!es.includes(String.prototype.toUpperCase.call(n)))return new w("Invalid channel mode: "+n,4e4,400)}}}var ca=class Kn extends de{constructor(t,n,i){var s,r;super(t.logger),this.retryCount=0,this.history=async function(l){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.history()","channel = "+this.name);let u=this.client.rest.channelMixin;if(l&&l.untilAttach){if(this.state!=="attached")throw new w("option untilAttach requires the channel to be attached",4e4,400);if(!this.properties.attachSerial)throw new w("untilAttach was specified and channel is attached, but attachSerial is not defined",4e4,400);delete l.untilAttach,l.from_serial=this.properties.attachSerial}return u.history(this,l)},this.whenState=l=>de.prototype.whenState.call(this,l,this.state),o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel()","started; name = "+n),this.name=n,this.channelOptions=Bt((s=t._Crypto)!=null?s:null,this.logger,i),this.client=t,this._presence=t._RealtimePresence?new t._RealtimePresence.RealtimePresence(this):null,this.connectionManager=t.connection.connectionManager,this.state="initialized",this.subscriptions=new de(this.logger),this.syncChannelSerial=void 0,this.properties={attachSerial:void 0,channelSerial:void 0},this.setOptions(i),this.errorReason=null,this._requestedFlags=null,this._mode=null,this._attachResume=!1,this._decodingContext={channelOptions:this.channelOptions,plugins:t.options.plugins||{},baseEncodedPreviousPayload:void 0},this._lastPayload={messageId:null,protocolMessageChannelSerial:null,decodeFailureRecoveryInProgress:null},this._allChannelChanges=new de(this.logger),(r=t.options.plugins)!=null&&r.Push&&(this._push=new t.options.plugins.Push.PushChannel(this))}get presence(){return this._presence||Ce("RealtimePresence"),this._presence}get push(){return this._push||Ce("Push"),this._push}invalidStateError(){return new w("Channel operation failed as channel state is "+this.state,90001,400,this.errorReason||void 0)}static processListenerArgs(t){return t=Array.prototype.slice.call(t),typeof t[0]=="function"&&t.unshift(null),t}async setOptions(t){var n;let i=this.channelOptions,s=aa(t);if(s)throw s;if(this.channelOptions=Bt((n=this.client._Crypto)!=null?n:null,this.logger,t),this._decodingContext&&(this._decodingContext.channelOptions=this.channelOptions),this._shouldReattachToSetOptions(t,i))return this.attachImpl(),new Promise((r,l)=>{this._allChannelChanges.once(["attached","update","detached","failed"],function(u){switch(this.event){case"update":case"attached":r();break;default:l(u.reason)}})})}_shouldReattachToSetOptions(t,n){if(!(this.state==="attached"||this.state==="attaching"))return!1;if(t?.params){let i=as(t.params),s=as(n.params);if(Object.keys(i).length!==Object.keys(s).length||!yi(s,i))return!0}return!!(t?.modes&&(!n.modes||!_i(t.modes,n.modes)))}async publish(...t){let n=t[0],i=t.length;if(!this.connectionManager.activeState())throw this.connectionManager.getError();if(i==1)if(me(n))n=[Ye(n)];else if(Array.isArray(n))n=vn(n);else throw new w("The single-argument form of publish() expects a message object or an array of message objects",40013,400);else n=[Ye({name:t[0],data:t[1]})];let s=this.client.options.maxMessageSize;await Hi(n,this.channelOptions);let r=_n(n);if(r>s)throw new w("Maximum size of messages that can be published at once exceeded ( was "+r+" bytes; limit is "+s+" bytes)",40009,400);return new Promise((l,u)=>{this._publish(n,g=>g?u(g):l())})}_publish(t,n){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.publish()","message count = "+t.length);let i=this.state;switch(i){case"failed":case"suspended":n(w.fromValues(this.invalidStateError()));break;default:{o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.publish()","sending message; channel state is "+i);let s=new ts;s.action=q.MESSAGE,s.channel=this.name,s.messages=t,this.sendMessage(s,n);break}}}onEvent(t){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.onEvent()","received message");let n=this.subscriptions;for(let i=0;i<t.length;i++){let s=t[i];n.emit(s.name,s)}}async attach(){return this.state==="attached"?null:new Promise((t,n)=>{this._attach(!1,null,(i,s)=>i?n(i):t(s))})}_attach(t,n,i){i||(i=r=>{r&&o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel._attach()","Channel attach failed: "+r.toString())});let s=this.connectionManager;if(!s.activeState()){i(s.getError());return}(this.state!=="attaching"||t)&&this.requestState("attaching",n),this.once(function(r){switch(this.event){case"attached":i?.(null,r);break;case"detached":case"suspended":case"failed":i?.(r.reason||s.getError()||new w("Unable to attach; reason unknown; state = "+this.event,9e4,500));break;case"detaching":i?.(new w("Attach request superseded by a subsequent detach request",9e4,409));break}})}attachImpl(){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.attachImpl()","sending ATTACH message");let t=xe({action:q.ATTACH,channel:this.name,params:this.channelOptions.params,channelSerial:this.properties.channelSerial});this._requestedFlags?t.encodeModesToFlags(this._requestedFlags):this.channelOptions.modes&&t.encodeModesToFlags(pi(this.channelOptions.modes)),this._attachResume&&t.setFlag("ATTACH_RESUME"),this._lastPayload.decodeFailureRecoveryInProgress&&(t.channelSerial=this._lastPayload.protocolMessageChannelSerial),this.sendMessage(t,os)}async detach(){let t=this.connectionManager;if(!t.activeState())throw t.getError();switch(this.state){case"suspended":this.notifyState("detached");return;case"detached":return;case"failed":throw new w("Unable to detach; channel state = failed",90001,400);default:this.requestState("detaching");case"detaching":return new Promise((n,i)=>{this.once(function(s){switch(this.event){case"detached":n();break;case"attached":case"suspended":case"failed":i(s.reason||t.getError()||new w("Unable to detach; reason unknown; state = "+this.event,9e4,500));break;case"attaching":i(new w("Detach request superseded by a subsequent attach request",9e4,409));break}})})}}detachImpl(t){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.detach()","sending DETACH message");let n=xe({action:q.DETACH,channel:this.name});this.sendMessage(n,t||os)}async subscribe(...t){let[n,i]=Kn.processListenerArgs(t);if(this.state==="failed")throw w.fromValues(this.invalidStateError());return n&&typeof n=="object"&&!Array.isArray(n)?this.client._FilteredSubscriptions.subscribeFilter(this,n,i):this.subscriptions.on(n,i),this.attach()}unsubscribe(...t){var n;let[i,s]=Kn.processListenerArgs(t);if(typeof i=="object"&&!s||(n=this.filteredSubscriptions)!=null&&n.has(s)){this.client._FilteredSubscriptions.getAndDeleteFilteredSubscriptions(this,i,s).forEach(r=>this.subscriptions.off(r));return}this.subscriptions.off(i,s)}sync(){switch(this.state){case"initialized":case"detaching":case"detached":throw new ce("Unable to sync to channel; not attached",4e4);default:}let t=this.connectionManager;if(!t.activeState())throw t.getError();let n=xe({action:q.SYNC,channel:this.name});this.syncChannelSerial&&(n.channelSerial=this.syncChannelSerial),t.send(n)}sendMessage(t,n){this.connectionManager.send(t,this.client.options.queueMessages,n)}sendPresence(t,n){let i=xe({action:q.PRESENCE,channel:this.name,presence:Array.isArray(t)?this.client._RealtimePresence.presenceMessagesFromValuesArray(t):[this.client._RealtimePresence.presenceMessageFromValues(t)]});this.sendMessage(i,n)}async processMessage(t){(t.action===q.ATTACHED||t.action===q.MESSAGE||t.action===q.PRESENCE)&&this.setChannelSerial(t.channelSerial);let n,i=!1;switch(t.action){case q.ATTACHED:{this.properties.attachSerial=t.channelSerial,this._mode=t.getMode(),this.params=t.params||{};let s=t.decodeModesFromFlags();this.modes=s&&cn(s)||void 0;let r=t.hasFlag("RESUMED"),l=t.hasFlag("HAS_PRESENCE"),u=t.hasFlag("HAS_BACKLOG");if(this.state==="attached"){r||this._presence&&this._presence.onAttached(l);let g=new xn(this.state,this.state,r,u,t.error);this._allChannelChanges.emit("update",g),(!r||this.channelOptions.updateOnAttached)&&this.emit("update",g)}else this.state==="detaching"?this.checkPendingState():this.notifyState("attached",t.error,r,l,u);break}case q.DETACHED:{let s=t.error?w.fromValues(t.error):new w("Channel detached",90001,404);this.state==="detaching"?this.notifyState("detached",s):this.state==="attaching"?this.notifyState("suspended",s):(this.state==="attached"||this.state==="suspended")&&this.requestState("attaching",s);break}case q.SYNC:if(i=!0,n=this.syncChannelSerial=t.channelSerial,!t.presence)break;case q.PRESENCE:{let s=t.presence;if(!s)break;let r=this.channelOptions;await this._decodeAndPrepareMessages(t,s,l=>wn(l,r)),this._presence&&this._presence.setPresence(s,i,n);break}case q.MESSAGE:{if(this.state!=="attached"){o.logAction(this.logger,o.LOG_MAJOR,"RealtimeChannel.processMessage()",'Message "'+t.id+'" skipped as this channel "'+this.name+'" state is not "attached" (state is "'+this.state+'").');return}let s=t.messages,r=s[0],l=s[s.length-1],u=t.channelSerial;if(r.extras&&r.extras.delta&&r.extras.delta.from!==this._lastPayload.messageId){let f='Delta message decode failure - previous message not available for message "'+t.id+'" on this channel "'+this.name+'".';o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel.processMessage()",f),this._startDecodeFailureRecovery(new w(f,40018,400));break}let{unrecoverableError:g}=await this._decodeAndPrepareMessages(t,s,f=>ht(f,this._decodingContext),f=>{let b=f;switch(b.code){case 40018:return this._startDecodeFailureRecovery(b),{unrecoverableError:!0};case 40019:case 40021:return this.notifyState("failed",b),{unrecoverableError:!0};default:return{unrecoverableError:!1}}});if(g)return;for(let f=0;f<s.length;f++){let b=s[f];u&&!b.version&&(b.version=u+":"+f.toString().padStart(3,"0"),b.expandFields())}this._lastPayload.messageId=l.id,this._lastPayload.protocolMessageChannelSerial=t.channelSerial,this.onEvent(s);break}case q.ERROR:{let s=t.error;s&&s.code==80016?this.checkPendingState():this.notifyState("failed",w.fromValues(s));break}default:o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel.processMessage()","Fatal protocol error: unrecognised action ("+t.action+")"),this.connectionManager.abort(He.unknownChannelErr())}}async _decodeAndPrepareMessages(t,n,i,s){let{id:r,connectionId:l,timestamp:u}=t;for(let g=0;g<n.length;g++){let f=n[g];try{await i(f)}catch(b){if(o.logAction(this.logger,o.LOG_ERROR,"RealtimeChannel.decodeAndPrepareMessages()",b.toString()),s){let{unrecoverableError:C}=s(b);if(C)return{unrecoverableError:!0}}}f.connectionId||(f.connectionId=l),f.timestamp||(f.timestamp=u),r&&!f.id&&(f.id=r+":"+g)}return{unrecoverableError:!1}}_startDecodeFailureRecovery(t){this._lastPayload.decodeFailureRecoveryInProgress||(o.logAction(this.logger,o.LOG_MAJOR,"RealtimeChannel.processMessage()","Starting decode failure recovery process."),this._lastPayload.decodeFailureRecoveryInProgress=!0,this._attach(!0,t,()=>{this._lastPayload.decodeFailureRecoveryInProgress=!1}))}onAttached(){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.onAttached","activating channel; name = "+this.name)}notifyState(t,n,i,s,r){if(o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.notifyState","name = "+this.name+", current state = "+this.state+", notifying state "+t),this.clearStateTimer(),["detached","suspended","failed"].includes(t)&&(this.properties.channelSerial=null),t===this.state)return;this._presence&&this._presence.actOnChannelState(t,s,n),t==="suspended"&&this.connectionManager.state.sendEvents?this.startRetryTimer():this.cancelRetryTimer(),n&&(this.errorReason=n);let l=new xn(this.state,t,i,r,n),u='Channel state for channel "'+this.name+'"',g=t+(n?"; reason: "+n:"");t==="failed"?o.logAction(this.logger,o.LOG_ERROR,u,g):o.logAction(this.logger,o.LOG_MAJOR,u,g),t!=="attaching"&&t!=="suspended"&&(this.retryCount=0),t==="attached"&&this.onAttached(),t==="attached"?this._attachResume=!0:(t==="detaching"||t==="failed")&&(this._attachResume=!1),this.state=t,this._allChannelChanges.emit(t,l),this.emit(t,l)}requestState(t,n){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.requestState","name = "+this.name+", state = "+t),this.notifyState(t,n),this.checkPendingState()}checkPendingState(){if(!this.connectionManager.state.sendEvents){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.checkPendingState","sendEvents is false; state is "+this.connectionManager.state.state);return}switch(o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.checkPendingState","name = "+this.name+", state = "+this.state),this.state){case"attaching":this.startStateTimerIfNotRunning(),this.attachImpl();break;case"detaching":this.startStateTimerIfNotRunning(),this.detachImpl();break;case"attached":this.sync();break;default:break}}timeoutPendingState(){switch(this.state){case"attaching":{let t=new w("Channel attach timed out",90007,408);this.notifyState("suspended",t);break}case"detaching":{let t=new w("Channel detach timed out",90007,408);this.notifyState("attached",t);break}default:this.checkPendingState();break}}startStateTimerIfNotRunning(){this.stateTimer||(this.stateTimer=setTimeout(()=>{o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.startStateTimerIfNotRunning","timer expired"),this.stateTimer=null,this.timeoutPendingState()},this.client.options.timeouts.realtimeRequestTimeout))}clearStateTimer(){let t=this.stateTimer;t&&(clearTimeout(t),this.stateTimer=null)}startRetryTimer(){if(this.retryTimer)return;this.retryCount++;let t=ln(this.client.options.timeouts.channelRetryTimeout,this.retryCount);this.retryTimer=setTimeout(()=>{this.state==="suspended"&&this.connectionManager.state.sendEvents&&(this.retryTimer=null,o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel retry timer expired","attempting a new attach"),this.requestState("attaching"))},t)}cancelRetryTimer(){this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null)}getReleaseErr(){let t=this.state;return t==="initialized"||t==="detached"||t==="failed"?null:new w("Can only release a channel in a state where there is no possibility of further updates from the server being received (initialized, detached, or failed); was "+t,90001,400)}setChannelSerial(t){o.logAction(this.logger,o.LOG_MICRO,"RealtimeChannel.setChannelSerial()","Updating channel serial; serial = "+t+"; previous = "+this.properties.channelSerial),t&&(this.properties.channelSerial=t)}async status(){return this.client.rest.channelMixin.status(this)}};function as(e){let t=e||{},{agent:n}=t;return S(t,["agent"])}var In=ca,cs=class Es extends Li{constructor(t){var n,i;if(super(U.objectifyOptions(t,!1,"BaseRealtime",o.defaultLogger)),o.logAction(this.logger,o.LOG_MINOR,"Realtime()",""),typeof EdgeRuntime=="string")throw new w(`Ably.Realtime instance cannot be used in Vercel Edge runtime. If you are running Vercel Edge functions, please replace your "new Ably.Realtime()" with "new Ably.Rest()" and use Ably Rest API instead of the Realtime API. If you are server-rendering your application in the Vercel Edge runtime, please use the condition "if (typeof EdgeRuntime === 'string')" to prevent instantiating Ably.Realtime instance during SSR in the Vercel Edge runtime.`,4e4,400);this._additionalTransportImplementations=Es.transportImplementationsFromPlugins(this.options.plugins),this._RealtimePresence=(i=(n=this.options.plugins)==null?void 0:n.RealtimePresence)!=null?i:null,this.connection=new ra(this,this.options),this._channels=new ha(this),this.options.autoConnect!==!1&&this.connect()}static transportImplementationsFromPlugins(t){let n={};return t?.WebSocketTransport&&(n[be.WebSocket]=t.WebSocketTransport),t?.XHRPolling&&(n[be.XhrPolling]=t.XHRPolling),n}get channels(){return this._channels}connect(){o.logAction(this.logger,o.LOG_MINOR,"Realtime.connect()",""),this.connection.connect()}close(){o.logAction(this.logger,o.LOG_MINOR,"Realtime.close()",""),this.connection.close()}};cs.EventEmitter=de;var la=cs,ha=class extends de{constructor(e){super(e.logger),this.realtime=e,this.all=Object.create(null),e.connection.connectionManager.on("transport.active",()=>{this.onTransportActive()})}channelSerials(){let e={};for(let t of Ke(this.all,!0)){let n=this.all[t];n.properties.channelSerial&&(e[t]=n.properties.channelSerial)}return e}recoverChannels(e){for(let t of Ke(e,!0)){let n=this.get(t);n.properties.channelSerial=e[t]}}async processChannelMessage(e){let t=e.channel;if(t===void 0){o.logAction(this.logger,o.LOG_ERROR,"Channels.processChannelMessage()","received event unspecified channel, action = "+e.action);return}let n=this.all[t];if(!n){o.logAction(this.logger,o.LOG_ERROR,"Channels.processChannelMessage()","received event for non-existent channel: "+t);return}await n.processMessage(e)}onTransportActive(){for(let e in this.all){let t=this.all[e];t.state==="attaching"||t.state==="detaching"?t.checkPendingState():t.state==="suspended"?t._attach(!1,null):t.state==="attached"&&t.requestState("attaching")}}propogateConnectionInterruption(e,t){let n={closing:"detached",closed:"detached",failed:"failed",suspended:"suspended"},i=["attaching","attached","detaching","suspended"],s=n[e];for(let r in this.all){let l=this.all[r];i.includes(l.state)&&l.notifyState(s,t)}}get(e,t){e=String(e);let n=this.all[e];if(!n)n=this.all[e]=new In(this.realtime,e,t);else if(t){if(n._shouldReattachToSetOptions(t,n.channelOptions))throw new w("Channels.get() cannot be used to set channel options that would cause the channel to reattach. Please, use RealtimeChannel.setOptions() instead.",4e4,400);n.setOptions(t)}return n}getDerived(e,t,n){if(t.filter){let i=Ut(t.filter),s=vi(e);e=`[filter=${i}${s.qualifierParam}]${s.channelName}`}return this.get(e,n)}release(e){e=String(e);let t=this.all[e];if(!t)return;let n=t.getReleaseErr();if(n)throw n;delete this.all[e]}},ua=la;function da(e,t){if(e.isSynthesized()||t.isSynthesized())return e.timestamp>=t.timestamp;let n=e.parseId(),i=t.parseId();return n.msgSerial===i.msgSerial?n.index>i.index:n.msgSerial>i.msgSerial}var En=class extends de{constructor(e,t,n=da){super(e.logger),this.presence=e,this.map=Object.create(null),this.syncInProgress=!1,this.residualMembers=null,this.memberKey=t,this.newerThan=n}get(e){return this.map[e]}getClient(e){let t=this.map,n=[];for(let i in t){let s=t[i];s.clientId==e&&s.action!="absent"&&n.push(s)}return n}list(e){let t=this.map,n=e&&e.clientId,i=e&&e.connectionId,s=[];for(let r in t){let l=t[r];l.action!=="absent"&&(n&&n!=l.clientId||i&&i!=l.connectionId||s.push(l))}return s}put(e){(e.action==="enter"||e.action==="update")&&(e=Ne(e),e.action="present");let t=this.map,n=this.memberKey(e);this.residualMembers&&delete this.residualMembers[n];let i=t[n];return i&&!this.newerThan(e,i)?!1:(t[n]=e,!0)}values(){let e=this.map,t=[];for(let n in e){let i=e[n];i.action!="absent"&&t.push(i)}return t}remove(e){let t=this.map,n=this.memberKey(e),i=t[n];return i&&!this.newerThan(e,i)?!1:(this.syncInProgress?(e=Ne(e),e.action="absent",t[n]=e):delete t[n],!!i)}startSync(){let e=this.map,t=this.syncInProgress;o.logAction(this.logger,o.LOG_MINOR,"PresenceMap.startSync()","channel = "+this.presence.channel.name+"; syncInProgress = "+t),this.syncInProgress||(this.residualMembers=ge(e),this.setInProgress(!0))}endSync(){let e=this.map,t=this.syncInProgress;if(o.logAction(this.logger,o.LOG_MINOR,"PresenceMap.endSync()","channel = "+this.presence.channel.name+"; syncInProgress = "+t),t){for(let n in e)e[n].action==="absent"&&delete e[n];this.presence._synthesizeLeaves(D(this.residualMembers));for(let n in this.residualMembers)delete e[n];this.residualMembers=null,this.setInProgress(!1)}this.emit("sync")}waitSync(e){let t=this.syncInProgress;if(o.logAction(this.logger,o.LOG_MINOR,"PresenceMap.waitSync()","channel = "+this.presence.channel.name+"; syncInProgress = "+t),!t){e();return}this.once("sync",e)}clear(){this.map={},this.setInProgress(!1),this.residualMembers=null}setInProgress(e){o.logAction(this.logger,o.LOG_MICRO,"PresenceMap.setInProgress()","inProgress = "+e),this.syncInProgress=e,this.presence.syncComplete=!e}};function fa(e){return e.channel.client.auth.clientId}function Pn(e){let t=e.channel.client,n=t.auth.clientId;return(!n||n==="*")&&t.connection.state==="connected"}function pa(e,t,n){switch(e.state){case"attached":case"suspended":n();break;case"initialized":case"detached":case"detaching":case"attaching":_e(e.attach(),function(i){i?t(i):n()});break;default:t(w.fromValues(e.invalidStateError()))}}var ga=class extends de{constructor(e){super(e.logger),this.channel=e,this.syncComplete=!1,this.members=new En(this,t=>t.clientId+":"+t.connectionId),this._myMembers=new En(this,t=>t.clientId),this.subscriptions=new de(this.logger),this.pendingPresence=[]}async enter(e){if(Pn(this))throw new w("clientId must be specified to enter a presence channel",40012,400);return this._enterOrUpdateClient(void 0,void 0,e,"enter")}async update(e){if(Pn(this))throw new w("clientId must be specified to update presence data",40012,400);return this._enterOrUpdateClient(void 0,void 0,e,"update")}async enterClient(e,t){return this._enterOrUpdateClient(void 0,e,t,"enter")}async updateClient(e,t){return this._enterOrUpdateClient(void 0,e,t,"update")}async _enterOrUpdateClient(e,t,n,i){let s=this.channel;if(!s.connectionManager.activeState())throw s.connectionManager.getError();o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence."+i+"Client()","channel = "+s.name+", id = "+e+", client = "+(t||"(implicit) "+fa(this)));let r=zi(n);switch(r.action=i,e&&(r.id=e),t&&(r.clientId=t),await yn(r,s.channelOptions),s.state){case"attached":return new Promise((l,u)=>{s.sendPresence(r,g=>g?u(g):l())});case"initialized":case"detached":s.attach();case"attaching":return new Promise((l,u)=>{this.pendingPresence.push({presence:r,callback:g=>g?u(g):l()})});default:{let l=new ce("Unable to "+i+" presence channel while in "+s.state+" state",90001);throw l.code=90001,l}}}async leave(e){if(Pn(this))throw new w("clientId must have been specified to enter or leave a presence channel",40012,400);return this.leaveClient(void 0,e)}async leaveClient(e,t){let n=this.channel;if(!n.connectionManager.activeState())throw n.connectionManager.getError();o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.leaveClient()","leaving; channel = "+this.channel.name+", client = "+e);let i=zi(t);return i.action="leave",e&&(i.clientId=e),new Promise((s,r)=>{switch(n.state){case"attached":n.sendPresence(i,l=>l?r(l):s());break;case"attaching":this.pendingPresence.push({presence:i,callback:l=>l?r(l):s()});break;case"initialized":case"failed":{let l=new ce("Unable to leave presence channel (incompatible state)",90001);r(l);break}default:r(n.invalidStateError())}})}async get(e){let t=!e||("waitForSync"in e?e.waitForSync:!0);return new Promise((n,i)=>{function s(r){n(e?r.list(e):r.values())}if(this.channel.state==="suspended"){t?i(w.fromValues({statusCode:400,code:91005,message:"Presence state is out of sync due to channel being in the SUSPENDED state"})):s(this.members);return}pa(this.channel,r=>i(r),()=>{let r=this.members;t?r.waitSync(function(){s(r)}):s(r)})})}async history(e){o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.history()","channel = "+this.name);let t=this.channel.client.rest.presenceMixin;if(e&&e.untilAttach)if(this.channel.state==="attached")delete e.untilAttach,e.from_serial=this.channel.properties.attachSerial;else throw new w("option untilAttach requires the channel to be attached, was: "+this.channel.state,4e4,400);return t.history(this,e)}setPresence(e,t,n){o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.setPresence()","received presence for "+e.length+" participants; syncChannelSerial = "+n);let i,s,r=this.members,l=this._myMembers,u=[],g=this.channel.connectionManager.connectionId;t&&(this.members.startSync(),n&&(s=n.match(/^[\w-]+:(.*)$/))&&(i=s[1]));for(let f=0;f<e.length;f++){let b=Ne(e[f]);switch(b.action){case"leave":r.remove(b)&&u.push(b),b.connectionId===g&&!b.isSynthesized()&&l.remove(b);break;case"enter":case"present":case"update":r.put(b)&&u.push(b),b.connectionId===g&&l.put(b);break}}t&&!i&&(r.endSync(),this.channel.syncChannelSerial=null);for(let f=0;f<u.length;f++){let b=u[f];this.subscriptions.emit(b.action,b)}}onAttached(e){o.logAction(this.logger,o.LOG_MINOR,"RealtimePresence.onAttached()","channel = "+this.channel.name+", hasPresence = "+e),e?this.members.startSync():(this._synthesizeLeaves(this.members.values()),this.members.clear()),this._ensureMyMembersPresent();let t=this.pendingPresence,n=t.length;if(n){this.pendingPresence=[];let i=[],s=dn.create(this.logger);o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence.onAttached","sending "+n+" queued presence messages");for(let r=0;r<n;r++){let l=t[r];i.push(l.presence),s.push(l.callback)}this.channel.sendPresence(i,s)}}actOnChannelState(e,t,n){switch(e){case"attached":this.onAttached(t);break;case"detached":case"failed":this._clearMyMembers(),this.members.clear();case"suspended":this.failPendingPresence(n);break}}failPendingPresence(e){if(this.pendingPresence.length){o.logAction(this.logger,o.LOG_MINOR,"RealtimeChannel.failPendingPresence","channel; name = "+this.channel.name+", err = "+J(e));for(let t=0;t<this.pendingPresence.length;t++)try{this.pendingPresence[t].callback(e)}catch{}this.pendingPresence=[]}}_clearMyMembers(){this._myMembers.clear()}_ensureMyMembersPresent(){let e=this._myMembers,t=this.channel.connectionManager.connectionId;for(let n in e.map){let i=e.map[n];o.logAction(this.logger,o.LOG_MICRO,"RealtimePresence._ensureMyMembersPresent()",'Auto-reentering clientId "'+i.clientId+'" into the presence set');let s=i.connectionId===t?i.id:void 0;this._enterOrUpdateClient(s,i.clientId,i.data,"enter").catch(r=>{let l=new w("Presence auto re-enter failed",91004,400,r);o.logAction(this.logger,o.LOG_ERROR,"RealtimePresence._ensureMyMembersPresent()","Presence auto re-enter failed; reason = "+J(r));let u=new xn(this.channel.state,this.channel.state,!0,!1,l);this.channel.emit("update",u)})}}_synthesizeLeaves(e){let t=this.subscriptions;e.forEach(function(n){let i=Ne({action:"leave",connectionId:n.connectionId,clientId:n.clientId,data:n.data,encoding:n.encoding,timestamp:Date.now()});t.emit("leave",i)})}async subscribe(...e){let t=In.processListenerArgs(e),n=t[0],i=t[1],s=this.channel;if(s.state==="failed")throw w.fromValues(s.invalidStateError());this.subscriptions.on(n,i),await s.attach()}unsubscribe(...e){let t=In.processListenerArgs(e),n=t[0],i=t[1];this.subscriptions.off(n,i)}},ma=ga,ya=be.WebSocket;function va(e){return!!e.on}var _a=class extends et{constructor(e,t,n){super(e,t,n),this.shortName=ya,n.heartbeats=m.Config.useProtocolHeartbeats,this.wsHost=n.host}static isAvailable(){return!!m.Config.WebSocket}createWebSocket(e,t){return this.uri=e+Te(t),new m.Config.WebSocket(this.uri)}toString(){return"WebSocketTransport; uri="+this.uri}connect(){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.connect()","starting"),et.prototype.connect.call(this);let e=this,t=this.params,n=t.options,s=(n.tls?"wss://":"ws://")+this.wsHost+":"+U.getPort(n)+"/";o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.connect()","uri: "+s),_e(this.auth.getAuthParams(),function(r,l){if(e.isDisposed)return;let u="";for(let f in l)u+=" "+f+": "+l[f]+";";if(o.logAction(e.logger,o.LOG_MINOR,"WebSocketTransport.connect()","authParams:"+u+" err: "+r),r){e.disconnect(r);return}let g=t.getConnectParams(l);try{let f=e.wsConnection=e.createWebSocket(s,g);f.binaryType=m.Config.binaryType,f.onopen=function(){e.onWsOpen()},f.onclose=function(b){e.onWsClose(b)},f.onmessage=function(b){e.onWsData(b.data)},f.onerror=function(b){e.onWsError(b)},va(f)&&f.on("ping",function(){e.onActivity()})}catch(f){o.logAction(e.logger,o.LOG_ERROR,"WebSocketTransport.connect()","Unexpected exception creating websocket: err = "+(f.stack||f.message)),e.disconnect(f)}})}send(e){let t=this.wsConnection;if(!t){o.logAction(this.logger,o.LOG_ERROR,"WebSocketTransport.send()","No socket connection");return}try{t.send(Fo(e,this.connectionManager.realtime._MsgPack,this.params.format))}catch(n){let i="Exception from ws connection when trying to send: "+J(n);o.logAction(this.logger,o.LOG_ERROR,"WebSocketTransport.send()",i),this.finish("disconnected",new w(i,5e4,500))}}onWsData(e){o.logAction(this.logger,o.LOG_MICRO,"WebSocketTransport.onWsData()","data received; length = "+e.length+"; type = "+typeof e);try{this.onProtocolMessage(jo(e,this.connectionManager.realtime._MsgPack,this.connectionManager.realtime._RealtimePresence,this.format))}catch(t){o.logAction(this.logger,o.LOG_ERROR,"WebSocketTransport.onWsData()","Unexpected exception handing channel message: "+t.stack)}}onWsOpen(){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onWsOpen()","opened WebSocket"),this.emit("preconnect")}onWsClose(e){let t,n;if(typeof e=="object"?(n=e.code,t=e.wasClean||n===1e3):(n=e,t=n==1e3),delete this.wsConnection,t){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onWsClose()","Cleanly closed WebSocket");let i=new w("Websocket closed",80003,400);this.finish("disconnected",i)}else{let i="Unclean disconnection of WebSocket ; code = "+n,s=new w(i,80003,400);o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onWsClose()",i),this.finish("disconnected",s)}this.emit("disposed")}onWsError(e){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.onError()","Error from WebSocket: "+e.message),m.Config.nextTick(()=>{this.disconnect(Error(e.message))})}dispose(){o.logAction(this.logger,o.LOG_MINOR,"WebSocketTransport.dispose()",""),this.isDisposed=!0;let e=this.wsConnection;e&&(e.onmessage=function(){},delete this.wsConnection,m.Config.nextTick(()=>{if(o.logAction(this.logger,o.LOG_MICRO,"WebSocketTransport.dispose()","closing websocket"),!e)throw new Error("WebSocketTransport.dispose(): wsConnection is not defined");e.close()}))}},ls=_a,ba=class{static subscribeFilter(e,t,n){let i=s=>{var r,l,u,g,f,b;let C={name:s.name,refTimeserial:(l=(r=s.extras)==null?void 0:r.ref)==null?void 0:l.timeserial,refType:(g=(u=s.extras)==null?void 0:u.ref)==null?void 0:g.type,isRef:!!((b=(f=s.extras)==null?void 0:f.ref)!=null&&b.timeserial),clientId:s.clientId};Object.entries(t).find(([O,R])=>R!==void 0?C[O]!==R:!1)||n(s)};this.addFilteredSubscription(e,t,n,i),e.subscriptions.on(i)}static addFilteredSubscription(e,t,n,i){var s;if(e.filteredSubscriptions||(e.filteredSubscriptions=new Map),e.filteredSubscriptions.has(n)){let r=e.filteredSubscriptions.get(n);r.set(t,((s=r?.get(t))==null?void 0:s.concat(i))||[i])}else e.filteredSubscriptions.set(n,new Map([[t,[i]]]))}static getAndDeleteFilteredSubscriptions(e,t,n){if(!e.filteredSubscriptions)return[];if(!n&&t)return Array.from(e.filteredSubscriptions.entries()).map(([r,l])=>{var u;let g=l.get(t);return l.delete(t),l.size===0&&((u=e.filteredSubscriptions)==null||u.delete(r)),g}).reduce((r,l)=>l?r.concat(...l):r,[]);if(!n||!e.filteredSubscriptions.has(n))return[];let i=e.filteredSubscriptions.get(n);if(!t){let r=Array.from(i.values()).reduce((l,u)=>l.concat(...u),[]);return e.filteredSubscriptions.delete(n),r}let s=i.get(t);return i.delete(t),s||[]}},Ie=class $n extends ua{constructor(t){var n;let i=$n._MsgPack;if(!i)throw new Error("Expected DefaultRealtime._MsgPack to have been set");super(U.objectifyOptions(t,!0,"Realtime",o.defaultLogger,E(y({},Ji),{Crypto:(n=$n.Crypto)!=null?n:void 0,MsgPack:i,RealtimePresence:{RealtimePresence:ma,presenceMessageFromValues:Ne,presenceMessagesFromValuesArray:Vi,presenceMessageFromWireProtocol:Ht},WebSocketTransport:ls,MessageInteractions:ba})))}static get Crypto(){if(this._Crypto===null)throw new Error("Encryption not enabled; use ably.encryption.js instead");return this._Crypto}static set Crypto(t){this._Crypto=t}};Ie.Utils=re,Ie.ConnectionManager=rs,Ie.ProtocolMessage=ts,Ie._Crypto=null,Ie.Message=Qi,Ie.PresenceMessage=Xi,Ie._MsgPack=null,Ie._Http=gn,Ie._PresenceMap=En;var Ln=Ie,Un=Uint8Array,dt=Uint32Array,Nn=Math.pow,hs=new dt(8),us=[],ft=new dt(64);function ds(e){return(e-(e|0))*Nn(2,32)|0}for(var pt=2,gt=0;gt<64;){for(Bn=!0,Wt=2;Wt<=pt/2;Wt++)pt%Wt===0&&(Bn=!1);Bn&&(gt<8&&(hs[gt]=ds(Nn(pt,1/2))),us[gt]=ds(Nn(pt,1/3)),gt++),pt++}var Bn,Wt,wa=!!new Un(new dt([1]).buffer)[0];function Gn(e){return wa?e>>>24|(e>>>16&255)<<8|(e&65280)<<8|e<<24:e}function Ee(e,t){return e>>>t|e<<32-t}function qn(e){var t=hs.slice(),n=e.length,i=n*8,s=512-(i+64)%512-1+i+65,r=new Un(s/8),l=new dt(r.buffer);r.set(e,0),r[n]=128,l[l.length-1]=Gn(i);for(var u,g=0;g<s/32;g+=16){var f=t.slice();for(u=0;u<64;u++){var b;if(u<16)b=Gn(l[g+u]);else{var C=ft[u-15],O=ft[u-2];b=ft[u-7]+ft[u-16]+(Ee(C,7)^Ee(C,18)^C>>>3)+(Ee(O,17)^Ee(O,19)^O>>>10)}ft[u]=b|=0;for(var R=(Ee(f[4],6)^Ee(f[4],11)^Ee(f[4],25))+(f[4]&f[5]^~f[4]&f[6])+f[7]+b+us[u],I=(Ee(f[0],2)^Ee(f[0],13)^Ee(f[0],22))+(f[0]&f[1]^f[2]&(f[0]^f[1])),x=7;x>0;x--)f[x]=f[x-1];f[0]=R+I|0,f[4]=f[4]+R|0}for(u=0;u<8;u++)t[u]=t[u]+f[u]|0}return new Un(new dt(t.map(function(L){return Gn(L)})).buffer)}function Ca(e,t){if(e.length>64&&(e=qn(e)),e.length<64){let u=new Uint8Array(64);u.set(e,0),e=u}for(var n=new Uint8Array(64),i=new Uint8Array(64),s=0;s<64;s++)n[s]=54^e[s],i[s]=92^e[s];var r=new Uint8Array(t.length+64);r.set(n,0),r.set(t,64);var l=new Uint8Array(96);return l.set(i,0),l.set(qn(r),64),qn(l)}var Ra=class{constructor(){this.base64CharSet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",this.hexCharSet="0123456789abcdef"}uint8ViewToBase64(e){let t="",n=this.base64CharSet,i=e.byteLength,s=i%3,r=i-s,l,u,g,f,b;for(let C=0;C<r;C=C+3)b=e[C]<<16|e[C+1]<<8|e[C+2],l=(b&16515072)>>18,u=(b&258048)>>12,g=(b&4032)>>6,f=b&63,t+=n[l]+n[u]+n[g]+n[f];return s==1?(b=e[r],l=(b&252)>>2,u=(b&3)<<4,t+=n[l]+n[u]+"=="):s==2&&(b=e[r]<<8|e[r+1],l=(b&64512)>>10,u=(b&1008)>>4,g=(b&15)<<2,t+=n[l]+n[u]+n[g]+"="),t}base64ToArrayBuffer(e){let t=atob?.(e),n=t.length,i=new Uint8Array(n);for(let s=0;s<n;s++){let r=t.charCodeAt(s);i[s]=r}return this.toArrayBuffer(i)}isBuffer(e){return e instanceof ArrayBuffer||ArrayBuffer.isView(e)}toBuffer(e){if(!ArrayBuffer)throw new Error("Can't convert to Buffer: browser does not support the necessary types");if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(this.toArrayBuffer(e));throw new Error("BufferUtils.toBuffer expected an ArrayBuffer or a view onto one")}toArrayBuffer(e){if(!ArrayBuffer)throw new Error("Can't convert to ArrayBuffer: browser does not support the necessary types");if(e instanceof ArrayBuffer)return e;if(ArrayBuffer.isView(e))return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);throw new Error("BufferUtils.toArrayBuffer expected an ArrayBuffer or a view onto one")}base64Encode(e){return this.uint8ViewToBase64(this.toBuffer(e))}base64Decode(e){if(ArrayBuffer&&m.Config.atob)return this.base64ToArrayBuffer(e);throw new Error("Expected ArrayBuffer to exist and Platform.Config.atob to be configured")}hexEncode(e){return this.toBuffer(e).reduce((n,i)=>n+i.toString(16).padStart(2,"0"),"")}hexDecode(e){if(e.length%2!==0)throw new Error("Can't create a byte array from a hex string of odd length");let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=parseInt(e.slice(2*n,2*(n+1)),16);return this.toArrayBuffer(t)}utf8Encode(e){if(m.Config.TextEncoder){let t=new m.Config.TextEncoder().encode(e);return this.toArrayBuffer(t)}else throw new Error("Expected TextEncoder to be configured")}utf8Decode(e){if(!this.isBuffer(e))throw new Error("Expected input of utf8decode to be an arraybuffer or typed array");if(TextDecoder)return new TextDecoder().decode(e);throw new Error("Expected TextDecoder to be configured")}areBuffersEqual(e,t){if(!e||!t)return!1;let n=this.toArrayBuffer(e),i=this.toArrayBuffer(t);if(n.byteLength!=i.byteLength)return!1;let s=new Uint8Array(n),r=new Uint8Array(i);for(var l=0;l<s.length;l++)if(s[l]!=r[l])return!1;return!0}byteLength(e){return e instanceof ArrayBuffer||ArrayBuffer.isView(e)?e.byteLength:-1}arrayBufferViewToBuffer(e){return this.toArrayBuffer(e)}hmacSha256(e,t){let n=Ca(this.toBuffer(t),this.toBuffer(e));return this.toArrayBuffer(n)}},fs=new Ra,ka=function(e,t){var n="aes",i=256,s="cbc",r=16;function l(O){if(O.algorithm==="aes"&&O.mode==="cbc"){if(O.keyLength===128||O.keyLength===256)return;throw new Error("Unsupported key length "+O.keyLength+" for aes-cbc encryption. Encryption key must be 128 or 256 bits (16 or 32 ASCII characters)")}}function u(O){return O.replace("_","/").replace("-","+")}function g(O){return O instanceof f}class f{constructor(R,I,x,L){this.algorithm=R,this.keyLength=I,this.mode=x,this.key=L}}class b{static getDefaultParams(R){var I;if(!R.key)throw new Error("Crypto.getDefaultParams: a key is required");typeof R.key=="string"?I=t.toArrayBuffer(t.base64Decode(u(R.key))):R.key instanceof ArrayBuffer?I=R.key:I=t.toArrayBuffer(R.key);var x=R.algorithm||n,L=I.byteLength*8,j=R.mode||s,z=new f(x,L,j,I);if(R.keyLength&&R.keyLength!==z.keyLength)throw new Error("Crypto.getDefaultParams: a keyLength of "+R.keyLength+" was specified, but the key actually has length "+z.keyLength);return l(z),z}static async generateRandomKey(R){try{return e.getRandomArrayBuffer((R||i)/8)}catch(I){throw new w("Failed to generate random key: "+I.message,400,5e4,I)}}static getCipher(R,I){var x,L=g(R)?R:this.getDefaultParams(R);return{cipherParams:L,cipher:new C(L,(x=R.iv)!=null?x:null,I)}}}b.CipherParams=f;class C{constructor(R,I,x){if(this.logger=x,!crypto.subtle)throw isSecureContext?new Error("Crypto operations are not possible since the browser\u2019s SubtleCrypto class is unavailable (reason unknown)."):new Error("Crypto operations are is not possible since the current environment is a non-secure context and hence the browser\u2019s SubtleCrypto class is not available.");this.algorithm=R.algorithm+"-"+String(R.keyLength)+"-"+R.mode,this.webCryptoAlgorithm=R.algorithm+"-"+R.mode,this.key=t.toArrayBuffer(R.key),this.iv=I?t.toArrayBuffer(I):null}concat(R,I){let x=new ArrayBuffer(R.byteLength+I.byteLength),L=new DataView(x),j=new DataView(t.toArrayBuffer(R));for(let $=0;$<j.byteLength;$++)L.setInt8($,j.getInt8($));let z=new DataView(t.toArrayBuffer(I));for(let $=0;$<z.byteLength;$++)L.setInt8(j.byteLength+$,z.getInt8($));return x}async encrypt(R){o.logAction(this.logger,o.LOG_MICRO,"CBCCipher.encrypt()","");let I=await this.getIv(),x=await crypto.subtle.importKey("raw",this.key,this.webCryptoAlgorithm,!1,["encrypt"]),L=await crypto.subtle.encrypt({name:this.webCryptoAlgorithm,iv:I},x,R);return this.concat(I,L)}async decrypt(R){o.logAction(this.logger,o.LOG_MICRO,"CBCCipher.decrypt()","");let I=t.toArrayBuffer(R),x=I.slice(0,r),L=I.slice(r),j=await crypto.subtle.importKey("raw",this.key,this.webCryptoAlgorithm,!1,["decrypt"]);return crypto.subtle.decrypt({name:this.webCryptoAlgorithm,iv:x},j,L)}async getIv(){if(this.iv){var R=this.iv;return this.iv=null,R}let I=await e.getRandomArrayBuffer(r);return t.toArrayBuffer(I)}}return b},ps=(e=>(e[e.REQ_SEND=0]="REQ_SEND",e[e.REQ_RECV=1]="REQ_RECV",e[e.REQ_RECV_POLL=2]="REQ_RECV_POLL",e[e.REQ_RECV_STREAM=3]="REQ_RECV_STREAM",e))(ps||{}),Ge=ps;function gs(){return new w("No HTTP request plugin provided. Provide at least one of the FetchRequest or XHRRequest plugins.",400,4e4)}var mt,ms=(mt=class{constructor(e){this.checksInProgress=null,this.checkConnectivity=void 0,this.supportsAuthHeaders=!1,this.supportsLinkHeaders=!1;var t;this.client=e??null;let n=e?.options.connectivityCheckUrl||U.connectivityCheckUrl,i=(t=e?.options.connectivityCheckParams)!=null?t:null,s=!e?.options.connectivityCheckUrl,r=y(y({},ms.bundledRequestImplementations),e?._additionalHTTPRequestImplementations),l=r.XHRRequest,u=r.FetchRequest,g=!!(l||u);if(!g)throw gs();m.Config.xhrSupported&&l?(this.supportsAuthHeaders=!0,this.Request=async function(f,b,C,O,R){return new Promise(I=>{var x;let L=l.createRequest(b,C,O,R,Ge.REQ_SEND,(x=e&&e.options.timeouts)!=null?x:null,this.logger,f);L.once("complete",(j,z,$,B,Re)=>I({error:j,body:z,headers:$,unpacked:B,statusCode:Re})),L.exec()})},e?.options.disableConnectivityCheck?this.checkConnectivity=async function(){return!0}:this.checkConnectivity=async function(){var f;o.logAction(this.logger,o.LOG_MICRO,"(XHRRequest)Http.checkConnectivity()","Sending; "+n);let b=await this.doUri(Z.Get,n,null,null,i),C=!1;return s?C=!b.error&&((f=b.body)==null?void 0:f.replace(/\n/,""))=="yes":C=!b.error&&qr(b.statusCode),o.logAction(this.logger,o.LOG_MICRO,"(XHRRequest)Http.checkConnectivity()","Result: "+C),C}):m.Config.fetchSupported&&u?(this.supportsAuthHeaders=!0,this.Request=async(f,b,C,O,R)=>u(f,e??null,b,C,O,R),this.checkConnectivity=async function(){var f;o.logAction(this.logger,o.LOG_MICRO,"(Fetch)Http.checkConnectivity()","Sending; "+n);let b=await this.doUri(Z.Get,n,null,null,null),C=!b.error&&((f=b.body)==null?void 0:f.replace(/\n/,""))=="yes";return o.logAction(this.logger,o.LOG_MICRO,"(Fetch)Http.checkConnectivity()","Result: "+C),C}):this.Request=async()=>({error:g?new ce("no supported HTTP transports available",null,400):gs()})}get logger(){var e,t;return(t=(e=this.client)==null?void 0:e.logger)!=null?t:o.defaultLogger}async doUri(e,t,n,i,s){return this.Request?this.Request(e,t,n,s,i):{error:new ce("Request invoked before assigned to",null,500)}}shouldFallback(e){let t=e.statusCode;return t===408&&!e.code||t===400&&!e.code||t>=500&&t<=504}},mt.methods=[Z.Get,Z.Delete,Z.Post,Z.Put,Z.Patch],mt.methodsWithoutBody=[Z.Get,Z.Delete],mt.methodsWithBody=[Z.Post,Z.Put,Z.Patch],mt),ys=ms,tt="ablyjs-storage-test",nt=typeof global<"u"?global:typeof window<"u"?window:self,Aa=class{constructor(){try{nt.sessionStorage.setItem(tt,tt),nt.sessionStorage.removeItem(tt),this.sessionSupported=!0}catch{this.sessionSupported=!1}try{nt.localStorage.setItem(tt,tt),nt.localStorage.removeItem(tt),this.localSupported=!0}catch{this.localSupported=!1}}get(e){return this._get(e,!1)}getSession(e){return this._get(e,!0)}remove(e){return this._remove(e,!1)}removeSession(e){return this._remove(e,!0)}set(e,t,n){return this._set(e,t,n,!1)}setSession(e,t,n){return this._set(e,t,n,!0)}_set(e,t,n,i){let s={value:t};return n&&(s.expires=Date.now()+n),this.storageInterface(i).setItem(e,JSON.stringify(s))}_get(e,t){if(t&&!this.sessionSupported)throw new Error("Session Storage not supported");if(!t&&!this.localSupported)throw new Error("Local Storage not supported");let n=this.storageInterface(t).getItem(e);if(!n)return null;let i=JSON.parse(n);return i.expires&&i.expires<Date.now()?(this.storageInterface(t).removeItem(e),null):i.value}_remove(e,t){return this.storageInterface(t).removeItem(e)}storageInterface(e){return e?nt.sessionStorage:nt.localStorage}},vs=new Aa,ee=hn(),Oa=typeof EdgeRuntime=="string";typeof Window>"u"&&typeof WorkerGlobalScope>"u"&&!Oa&&console.log("Warning: this distribution of Ably is intended for browsers. On nodejs, please use the 'ably' package on npm");function Sa(){let e=ee.location;return!ee.WebSocket||!e||!e.origin||e.origin.indexOf("http")>-1}function Ta(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}var Ma=ee.navigator&&ee.navigator.userAgent.toString(),xa=ee.location&&ee.location.href,Ia={agent:"browser",logTimestamps:!0,userAgent:Ma,currentUrl:xa,binaryType:"arraybuffer",WebSocket:ee.WebSocket,fetchSupported:!!ee.fetch,xhrSupported:ee.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest,allowComet:Sa(),useProtocolHeartbeats:!0,supportsBinary:!!ee.TextDecoder,preferBinary:!1,ArrayBuffer:ee.ArrayBuffer,atob:ee.atob,nextTick:typeof ee.setImmediate<"u"?ee.setImmediate.bind(ee):function(e){setTimeout(e,0)},addEventListener:ee.addEventListener,inspect:JSON.stringify,stringByteSize:function(e){return ee.TextDecoder&&new ee.TextEncoder().encode(e).length||e.length},TextEncoder:ee.TextEncoder,TextDecoder:ee.TextDecoder,getRandomArrayBuffer:async function(e){let t=new Uint8Array(e);return ee.crypto.getRandomValues(t),t.buffer},isWebworker:Ta(),push:{platform:"browser",formFactor:"desktop",storage:vs}},_s=Ia;function Ea(e){let t=[80015,80017,80030];return e.code?Ue.isTokenErr(e)?!1:t.includes(e.code)?!0:e.code>=4e4&&e.code<5e4:!1}function Dn(e){return Ea(e)?[xe({action:q.ERROR,error:e})]:[xe({action:q.DISCONNECTED,error:e})]}var Pa=class extends et{constructor(e,t,n){super(e,t,n,!0),this.onAuthUpdated=i=>{this.authParams={access_token:i.token}},this.stream="stream"in n?n.stream:!0,this.sendRequest=null,this.recvRequest=null,this.pendingCallback=null,this.pendingItems=null}connect(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.connect()","starting"),et.prototype.connect.call(this);let e=this.params,t=e.options,n=U.getHost(t,e.host),i=U.getPort(t),s=t.tls?"https://":"http://";this.baseUri=s+n+":"+i+"/comet/";let r=this.baseUri+"connect";o.logAction(this.logger,o.LOG_MINOR,"CometTransport.connect()","uri: "+r),_e(this.auth.getAuthParams(),(l,u)=>{if(l){this.disconnect(l);return}if(this.isDisposed)return;this.authParams=u;let g=this.params.getConnectParams(u);"stream"in g&&(this.stream=g.stream),o.logAction(this.logger,o.LOG_MINOR,"CometTransport.connect()","connectParams:"+Te(g));let f=!1,b=this.recvRequest=this.createRequest(r,null,g,null,this.stream?Ge.REQ_RECV_STREAM:Ge.REQ_RECV);b.on("data",C=>{this.recvRequest&&(f||(f=!0,this.emit("preconnect")),this.onData(C))}),b.on("complete",C=>{if(this.recvRequest||(C=C||new w("Request cancelled",80003,400)),this.recvRequest=null,!f&&!C&&(f=!0,this.emit("preconnect")),this.onActivity(),C){C.code?this.onData(Dn(C)):this.disconnect(C);return}m.Config.nextTick(()=>{this.recv()})}),b.exec()})}requestClose(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.requestClose()"),this._requestCloseOrDisconnect(!0)}requestDisconnect(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.requestDisconnect()"),this._requestCloseOrDisconnect(!1)}_requestCloseOrDisconnect(e){let t=e?this.closeUri:this.disconnectUri;if(t){let n=this.createRequest(t,null,this.authParams,null,Ge.REQ_SEND);n.on("complete",i=>{i&&(o.logAction(this.logger,o.LOG_ERROR,"CometTransport.request"+(e?"Close()":"Disconnect()"),"request returned err = "+J(i)),this.finish("disconnected",i))}),n.exec()}}dispose(){o.logAction(this.logger,o.LOG_MINOR,"CometTransport.dispose()",""),this.isDisposed||(this.isDisposed=!0,this.recvRequest&&(o.logAction(this.logger,o.LOG_MINOR,"CometTransport.dispose()","aborting recv request"),this.recvRequest.abort(),this.recvRequest=null),this.finish("disconnected",He.disconnected()),m.Config.nextTick(()=>{this.emit("disposed")}))}onConnect(e){var t;if(this.isDisposed)return;let n=(t=e.connectionDetails)==null?void 0:t.connectionKey;et.prototype.onConnect.call(this,e);let i=this.baseUri+n;o.logAction(this.logger,o.LOG_MICRO,"CometTransport.onConnect()","baseUri = "+i),this.sendUri=i+"/send",this.recvUri=i+"/recv",this.closeUri=i+"/close",this.disconnectUri=i+"/disconnect"}send(e){if(this.sendRequest){this.pendingItems=this.pendingItems||[],this.pendingItems.push(e);return}let t=this.pendingItems||[];t.push(e),this.pendingItems=null,this.sendItems(t)}sendAnyPending(){let e=this.pendingItems;e&&(this.pendingItems=null,this.sendItems(e))}sendItems(e){let t=this.sendRequest=this.createRequest(this.sendUri,null,this.authParams,this.encodeRequest(e),Ge.REQ_SEND);t.on("complete",(n,i)=>{if(n&&o.logAction(this.logger,o.LOG_ERROR,"CometTransport.sendItems()","on complete: err = "+J(n)),this.sendRequest=null,n){n.code?this.onData(Dn(n)):this.disconnect(n);return}i&&this.onData(i),this.pendingItems&&m.Config.nextTick(()=>{this.sendRequest||this.sendAnyPending()})}),t.exec()}recv(){if(this.recvRequest||!this.isConnected)return;let e=this.recvRequest=this.createRequest(this.recvUri,null,this.authParams,null,this.stream?Ge.REQ_RECV_STREAM:Ge.REQ_RECV_POLL);e.on("data",t=>{this.onData(t)}),e.on("complete",t=>{if(this.recvRequest=null,this.onActivity(),t){t.code?this.onData(Dn(t)):this.disconnect(t);return}m.Config.nextTick(()=>{this.recv()})}),e.exec()}onData(e){try{let t=this.decodeResponse(e);if(t&&t.length)for(let n=0;n<t.length;n++)this.onProtocolMessage(kn(t[n],this.connectionManager.realtime._RealtimePresence))}catch(t){o.logAction(this.logger,o.LOG_ERROR,"CometTransport.onData()","Unexpected exception handing channel event: "+t.stack)}}encodeRequest(e){return JSON.stringify(e)}decodeResponse(e){return typeof e=="string"?JSON.parse(e):e}},La=Pa;function Ua(e,t){return cn(Ke(t)).includes("x-ably-errorcode")}function Na(e,t){if(Ua(e,t))return e.error&&w.fromValues(e.error)}var Ba=function(){},Ga=0,bs={};function qa(e,t){return e.getResponseHeader&&e.getResponseHeader(t)}function Da(e){return e.getResponseHeader&&(e.getResponseHeader("transfer-encoding")||!e.getResponseHeader("content-length"))}function Ha(e){let t=e.getAllResponseHeaders().trim().split(`\r
8
+ `),n={};for(let i=0;i<t.length;i++){let s=t[i].split(":").map(r=>r.trim());n[s[0].toLowerCase()]=s[1]}return n}var Fa=class Ps extends de{constructor(t,n,i,s,r,l,u,g){super(u),i=i||{},i.rnd=Lt(),this.uri=t+Te(i),this.headers=n||{},this.body=s,this.method=g?g.toUpperCase():ye(s)?"GET":"POST",this.requestMode=r,this.timeouts=l,this.timedOut=!1,this.requestComplete=!1,this.id=String(++Ga),bs[this.id]=this}static createRequest(t,n,i,s,r,l,u,g){let f=l||U.TIMEOUTS;return new Ps(t,n,ge(i),s,r,f,u,g)}complete(t,n,i,s,r){this.requestComplete||(this.requestComplete=!0,!t&&n&&this.emit("data",n),this.emit("complete",t,n,i,s,r),this.dispose())}abort(){this.dispose()}exec(){let t=this.headers,n=this.requestMode==Ge.REQ_SEND?this.timeouts.httpRequestTimeout:this.timeouts.recvTimeout,i=this.timer=setTimeout(()=>{this.timedOut=!0,r.abort()},n),s=this.method,r=this.xhr=new XMLHttpRequest,l=t.accept,u=this.body,g="text";l?l.indexOf("application/x-msgpack")===0&&(g="arraybuffer"):t.accept="application/json",u&&(t["content-type"]||(t["content-type"]="application/json")).indexOf("application/json")>-1&&typeof u!="string"&&(u=JSON.stringify(u)),r.open(s,this.uri,!0),r.responseType=g,"authorization"in t&&(r.withCredentials=!0);for(let B in t)r.setRequestHeader(B,t[B]);let f=(B,Re,fe,bt)=>{var it;let Wn=Re+" (event type: "+B.type+")";(it=this==null?void 0:this.xhr)!=null&&it.statusText&&(Wn+=", current statusText is "+this.xhr.statusText),o.logAction(this.logger,o.LOG_ERROR,"Request.on"+B.type+"()",Wn),this.complete(new ce(Wn,fe,bt))};r.onerror=function(B){f(B,"XHR error occurred",null,400)},r.onabort=B=>{this.timedOut?f(B,"Request aborted due to request timeout expiring",null,408):f(B,"Request cancelled",null,400)},r.ontimeout=function(B){f(B,"Request timed out",null,408)};let b,C,O,R=0,I=!1,x=()=>{if(clearTimeout(i),O=C<400,C==204){this.complete(null,null,null,null,C);return}b=this.requestMode==Ge.REQ_RECV_STREAM&&O&&Da(r)},L=()=>{let B;try{let fe=qa(r,"content-type");if(fe?fe.indexOf("application/json")>=0:r.responseType=="text"){let it=r.responseType==="arraybuffer"?m.BufferUtils.utf8Decode(r.response):String(r.responseText);it.length?B=JSON.parse(it):B=it,I=!0}else B=r.response;B.response!==void 0?(C=B.statusCode,O=C<400,t=B.headers,B=B.response):t=Ha(r)}catch(fe){this.complete(new ce("Malformed response body from server: "+fe.message,null,400));return}if(O||Array.isArray(B)){this.complete(null,B,t,I,C);return}let Re=Na(B,t);Re||(Re=new ce("Error response received from server: "+C+" body was: "+m.Config.inspect(B),null,C)),this.complete(Re,B,t,I,C)};function j(){let B=r.responseText,Re=B.length-1,fe,bt;for(;R<Re&&(fe=B.indexOf(`
9
+ `,R))>-1;)bt=B.slice(R,fe),R=fe+1,z(bt)}let z=B=>{try{B=JSON.parse(B)}catch(Re){this.complete(new ce("Malformed response body from server: "+Re.message,null,400));return}this.emit("data",B)},$=()=>{j(),this.streamComplete=!0,m.Config.nextTick(()=>{this.complete()})};r.onreadystatechange=function(){let B=r.readyState;B<3||r.status!==0&&(C===void 0&&(C=r.status,x()),B==3&&b?j():B==4&&(b?$():L()))},r.send(u)}dispose(){let t=this.xhr;if(t){t.onreadystatechange=t.onerror=t.onabort=t.ontimeout=Ba,this.xhr=null;let n=this.timer;n&&(clearTimeout(n),this.timer=null),this.requestComplete||t.abort()}delete bs[this.id]}},ws=Fa,Cs=be.XhrPolling,ja=class extends La{constructor(e,t,n){super(e,t,n),this.shortName=Cs,n.stream=!1,this.shortName=Cs}static isAvailable(){return!!(m.Config.xhrSupported&&m.Config.allowComet)}toString(){return"XHRPollingTransport; uri="+this.baseUri+"; isConnected="+this.isConnected}createRequest(e,t,n,i,s){return ws.createRequest(e,t,n,i,s,this.timeouts,this.logger)}},Wa=ja,Va=["xhr_polling"],za={order:Va,bundledImplementations:{web_socket:ls,xhr_polling:Wa}},Ka=za,$a={connectivityCheckUrl:"https://internet-up.ably-realtime.com/is-the-internet-up.txt",wsConnectivityCheckUrl:"wss://ws-up.ably-realtime.com",defaultTransports:[be.XhrPolling,be.WebSocket]},Ja=$a;function Qa(e){if(e===void 0)return"undefined";let t,n;if(e instanceof ArrayBuffer?(n="ArrayBuffer",t=new DataView(e)):e instanceof DataView&&(n="DataView",t=e),!t)return JSON.stringify(e);let i=[];for(let s=0;s<e.byteLength;s++){if(s>20){i.push("...");break}let r=t.getUint8(s).toString(16);r.length===1&&(r="0"+r),i.push(r)}return"<"+n+" "+i.join(" ")+">"}function yt(e,t,n){for(let i=0,s=n.length;i<s;i++){let r=n.charCodeAt(i);if(r<128){e.setUint8(t++,r>>>0&127|0);continue}if(r<2048){e.setUint8(t++,r>>>6&31|192),e.setUint8(t++,r>>>0&63|128);continue}if(r<65536){e.setUint8(t++,r>>>12&15|224),e.setUint8(t++,r>>>6&63|128),e.setUint8(t++,r>>>0&63|128);continue}if(r<1114112){e.setUint8(t++,r>>>18&7|240),e.setUint8(t++,r>>>12&63|128),e.setUint8(t++,r>>>6&63|128),e.setUint8(t++,r>>>0&63|128);continue}throw new Error("bad codepoint "+r)}}function Rs(e,t,n){let i="";for(let s=t,r=t+n;s<r;s++){let l=e.getUint8(s);if(!(l&128)){i+=String.fromCharCode(l);continue}if((l&224)===192){i+=String.fromCharCode((l&15)<<6|e.getUint8(++s)&63);continue}if((l&240)===224){i+=String.fromCharCode((l&15)<<12|(e.getUint8(++s)&63)<<6|(e.getUint8(++s)&63)<<0);continue}if((l&248)===240){i+=String.fromCharCode((l&7)<<18|(e.getUint8(++s)&63)<<12|(e.getUint8(++s)&63)<<6|(e.getUint8(++s)&63)<<0);continue}throw new Error("Invalid byte "+l.toString(16))}return i}function Hn(e){let t=0;for(let n=0,i=e.length;n<i;n++){let s=e.charCodeAt(n);if(s<128){t+=1;continue}if(s<2048){t+=2;continue}if(s<65536){t+=3;continue}if(s<1114112){t+=4;continue}throw new Error("bad codepoint "+s)}return t}function Xa(e,t){let n=_t(e,t);if(n===0)return;let i=new ArrayBuffer(n),s=new DataView(i);return vt(e,s,0,t),i}var Fn=65536*65536,ks=1/Fn;function Ya(e,t){return t=t||0,e.getInt32(t)*Fn+e.getUint32(t+4)}function Za(e,t){return t=t||0,e.getUint32(t)*Fn+e.getUint32(t+4)}function ec(e,t,n){n<9223372036854776e3?(e.setInt32(t,Math.floor(n*ks)),e.setInt32(t+4,n&-1)):(e.setUint32(t,2147483647),e.setUint32(t+4,2147483647))}function tc(e,t,n){n<18446744073709552e3?(e.setUint32(t,Math.floor(n*ks)),e.setInt32(t+4,n&-1)):(e.setUint32(t,4294967295),e.setUint32(t+4,4294967295))}var nc=class{constructor(e,t){this.map=n=>{let i={};for(let s=0;s<n;s++){let r=this.parse();i[r]=this.parse()}return i},this.bin=n=>{let i=new ArrayBuffer(n);return new Uint8Array(i).set(new Uint8Array(this.view.buffer,this.offset,n),0),this.offset+=n,i},this.buf=this.bin,this.str=n=>{let i=Rs(this.view,this.offset,n);return this.offset+=n,i},this.array=n=>{let i=new Array(n);for(let s=0;s<n;s++)i[s]=this.parse();return i},this.ext=n=>(this.offset+=n,{type:this.view.getInt8(this.offset),data:this.buf(n)}),this.parse=()=>{let n=this.view.getUint8(this.offset),i,s;if(!(n&128))return this.offset++,n;if((n&240)===128)return s=n&15,this.offset++,this.map(s);if((n&240)===144)return s=n&15,this.offset++,this.array(s);if((n&224)===160)return s=n&31,this.offset++,this.str(s);if((n&224)===224)return i=this.view.getInt8(this.offset),this.offset++,i;switch(n){case 192:return this.offset++,null;case 193:this.offset++;return;case 194:return this.offset++,!1;case 195:return this.offset++,!0;case 196:return s=this.view.getUint8(this.offset+1),this.offset+=2,this.bin(s);case 197:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.bin(s);case 198:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.bin(s);case 199:return s=this.view.getUint8(this.offset+1),this.offset+=2,this.ext(s);case 200:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.ext(s);case 201:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.ext(s);case 202:return i=this.view.getFloat32(this.offset+1),this.offset+=5,i;case 203:return i=this.view.getFloat64(this.offset+1),this.offset+=9,i;case 204:return i=this.view.getUint8(this.offset+1),this.offset+=2,i;case 205:return i=this.view.getUint16(this.offset+1),this.offset+=3,i;case 206:return i=this.view.getUint32(this.offset+1),this.offset+=5,i;case 207:return i=Za(this.view,this.offset+1),this.offset+=9,i;case 208:return i=this.view.getInt8(this.offset+1),this.offset+=2,i;case 209:return i=this.view.getInt16(this.offset+1),this.offset+=3,i;case 210:return i=this.view.getInt32(this.offset+1),this.offset+=5,i;case 211:return i=Ya(this.view,this.offset+1),this.offset+=9,i;case 212:return s=1,this.offset++,this.ext(s);case 213:return s=2,this.offset++,this.ext(s);case 214:return s=4,this.offset++,this.ext(s);case 215:return s=8,this.offset++,this.ext(s);case 216:return s=16,this.offset++,this.ext(s);case 217:return s=this.view.getUint8(this.offset+1),this.offset+=2,this.str(s);case 218:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.str(s);case 219:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.str(s);case 220:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.array(s);case 221:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.array(s);case 222:return s=this.view.getUint16(this.offset+1),this.offset+=3,this.map(s);case 223:return s=this.view.getUint32(this.offset+1),this.offset+=5,this.map(s)}throw new Error("Unknown type 0x"+n.toString(16))},this.offset=t||0,this.view=e}};function ic(e){let t=new DataView(e),n=new nc(t),i=n.parse();if(n.offset!==e.byteLength)throw new Error(e.byteLength-n.offset+" trailing bytes");return i}function As(e,t){return Object.keys(e).filter(function(n){let i=e[n],s=typeof i;return(!t||i!=null)&&(s!=="function"||!!i.toJSON)})}function vt(e,t,n,i){let s=typeof e;if(typeof e=="string"){let r=Hn(e);if(r<32)return t.setUint8(n,r|160),yt(t,n+1,e),1+r;if(r<256)return t.setUint8(n,217),t.setUint8(n+1,r),yt(t,n+2,e),2+r;if(r<65536)return t.setUint8(n,218),t.setUint16(n+1,r),yt(t,n+3,e),3+r;if(r<4294967296)return t.setUint8(n,219),t.setUint32(n+1,r),yt(t,n+5,e),5+r}if(ArrayBuffer.isView&&ArrayBuffer.isView(e)&&(e=e.buffer),e instanceof ArrayBuffer){let r=e.byteLength;if(r<256)return t.setUint8(n,196),t.setUint8(n+1,r),new Uint8Array(t.buffer).set(new Uint8Array(e),n+2),2+r;if(r<65536)return t.setUint8(n,197),t.setUint16(n+1,r),new Uint8Array(t.buffer).set(new Uint8Array(e),n+3),3+r;if(r<4294967296)return t.setUint8(n,198),t.setUint32(n+1,r),new Uint8Array(t.buffer).set(new Uint8Array(e),n+5),5+r}if(typeof e=="number"){if(Math.floor(e)!==e)return t.setUint8(n,203),t.setFloat64(n+1,e),9;if(e>=0){if(e<128)return t.setUint8(n,e),1;if(e<256)return t.setUint8(n,204),t.setUint8(n+1,e),2;if(e<65536)return t.setUint8(n,205),t.setUint16(n+1,e),3;if(e<4294967296)return t.setUint8(n,206),t.setUint32(n+1,e),5;if(e<18446744073709552e3)return t.setUint8(n,207),tc(t,n+1,e),9;throw new Error("Number too big 0x"+e.toString(16))}if(e>=-32)return t.setInt8(n,e),1;if(e>=-128)return t.setUint8(n,208),t.setInt8(n+1,e),2;if(e>=-32768)return t.setUint8(n,209),t.setInt16(n+1,e),3;if(e>=-2147483648)return t.setUint8(n,210),t.setInt32(n+1,e),5;if(e>=-9223372036854776e3)return t.setUint8(n,211),ec(t,n+1,e),9;throw new Error("Number too small -0x"+(-e).toString(16).substr(1))}if(s==="undefined")return i?0:(t.setUint8(n,212),t.setUint8(n+1,0),t.setUint8(n+2,0),3);if(e===null)return i?0:(t.setUint8(n,192),1);if(s==="boolean")return t.setUint8(n,e?195:194),1;if(typeof e.toJSON=="function")return vt(e.toJSON(),t,n,i);if(s==="object"){let r,l=0,u,g=Array.isArray(e);if(g?r=e.length:(u=As(e,i),r=u.length),r<16?(t.setUint8(n,r|(g?144:128)),l=1):r<65536?(t.setUint8(n,g?220:222),t.setUint16(n+1,r),l=3):r<4294967296&&(t.setUint8(n,g?221:223),t.setUint32(n+1,r),l=5),g)for(let f=0;f<r;f++)l+=vt(e[f],t,n+l,i);else if(u)for(let f=0;f<r;f++){let b=u[f];l+=vt(b,t,n+l),l+=vt(e[b],t,n+l,i)}return l}if(s==="function")return 0;throw new Error("Unknown type "+s)}function _t(e,t){let n=typeof e;if(n==="string"){let i=Hn(e);if(i<32)return 1+i;if(i<256)return 2+i;if(i<65536)return 3+i;if(i<4294967296)return 5+i}if(ArrayBuffer.isView&&ArrayBuffer.isView(e)&&(e=e.buffer),e instanceof ArrayBuffer){let i=e.byteLength;if(i<256)return 2+i;if(i<65536)return 3+i;if(i<4294967296)return 5+i}if(typeof e=="number"){if(Math.floor(e)!==e)return 9;if(e>=0){if(e<128)return 1;if(e<256)return 2;if(e<65536)return 3;if(e<4294967296)return 5;if(e<18446744073709552e3)return 9;throw new Error("Number too big 0x"+e.toString(16))}if(e>=-32)return 1;if(e>=-128)return 2;if(e>=-32768)return 3;if(e>=-2147483648)return 5;if(e>=-9223372036854776e3)return 9;throw new Error("Number too small -0x"+e.toString(16).substr(1))}if(n==="boolean")return 1;if(e===null)return t?0:1;if(e===void 0)return t?0:3;if(typeof e.toJSON=="function")return _t(e.toJSON(),t);if(n==="object"){let i,s=0;if(Array.isArray(e)){i=e.length;for(let r=0;r<i;r++)s+=_t(e[r],t)}else{let r=As(e,t);i=r.length;for(let l=0;l<i;l++){let u=r[l];s+=_t(u)+_t(e[u],t)}}if(i<16)return 1+s;if(i<65536)return 3+s;if(i<4294967296)return 5+s;throw new Error("Array or object too long 0x"+i.toString(16))}if(n==="function")return 0;throw new Error("Unknown type "+n)}var jn={encode:Xa,decode:ic,inspect:Qa,utf8Write:yt,utf8Read:Rs,utf8ByteCount:Hn};function sc(e,t){return!!t.get("x-ably-errorcode")}function rc(e,t){if(sc(e,t))return e.error&&w.fromValues(e.error)}function oc(e){let t={};return e.forEach((n,i)=>{t[i]=n}),t}async function ac(e,t,n,i,s,r){let l=new Headers(i||{}),u=e?e.toUpperCase():ye(r)?"GET":"POST",g=new AbortController,f,b=new Promise(R=>{f=setTimeout(()=>{g.abort(),R({error:new ce("Request timed out",null,408)})},t?t.options.timeouts.httpRequestTimeout:U.TIMEOUTS.httpRequestTimeout)}),C={method:u,headers:l,body:r,signal:g.signal};m.Config.isWebworker||(C.credentials=l.has("authorization")?"include":"same-origin");let O=(async()=>{try{let R=new URLSearchParams(s||{});R.set("rnd",Lt());let I=n+"?"+R,x=await hn().fetch(I,C);if(clearTimeout(f),x.status==204)return{error:null,statusCode:x.status};let L=x.headers.get("Content-Type"),j;L&&L.indexOf("application/x-msgpack")>-1?j=await x.arrayBuffer():L&&L.indexOf("application/json")>-1?j=await x.json():j=await x.text();let z=!!L&&L.indexOf("application/x-msgpack")===-1,$=oc(x.headers);return x.ok?{error:null,body:j,headers:$,unpacked:z,statusCode:x.status}:{error:rc(j,x.headers)||new ce("Error response received from server: "+x.status+" body was: "+m.Config.inspect(j),null,x.status),body:j,headers:$,unpacked:z,statusCode:x.status}}catch(R){return clearTimeout(f),{error:R}}})();return Promise.race([b,O])}var cc={XHRRequest:ws,FetchRequest:ac},Os=ka(_s,fs);m.Crypto=Os,m.BufferUtils=fs,m.Http=ys,m.Config=_s,m.Transports=Ka,m.WebStorage=vs;for(let e of[Cn,Ln])e.Crypto=Os,e._MsgPack=jn;ys.bundledRequestImplementations=cc,o.initLogHandlers(),m.Defaults=Br(Ja),m.Config.agent&&(m.Defaults.agent+=" "+m.Config.agent);var lc={ErrorInfo:w,Rest:Cn,Realtime:Ln,msgpack:jn};if(typeof a.exports=="object"&&typeof c=="object"){var hc=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Object.getOwnPropertyNames(t))!Object.prototype.hasOwnProperty.call(e,s)&&s!==n&&Object.defineProperty(e,s,{get:()=>t[s],enumerable:!(i=Object.getOwnPropertyDescriptor(t,s))||i.enumerable});return e};a.exports=hc(a.exports,c)}return a.exports})});var Gc={};yc(Gc,{BaseportalChat:()=>St,default:()=>Bc});var zt=class{constructor(a,h){this.channelToken=a,this.baseUrl=`${h}/public/chat`}setVisitorIdentity(a,h){this.visitorEmail=a,this.visitorHash=h}clearVisitorIdentity(){this.visitorEmail=void 0,this.visitorHash=void 0}headers(){let a={"Content-Type":"application/json","x-channel-token":this.channelToken};return this.visitorEmail&&(a["x-visitor-email"]=this.visitorEmail),this.visitorHash&&(a["x-visitor-hash"]=this.visitorHash),a}async request(a,h,d){let p=await fetch(`${this.baseUrl}${h}`,{method:a,headers:this.headers(),body:d?JSON.stringify(d):void 0});if(!p.ok){let v=await p.text().catch(()=>"");throw new Error(`[BaseportalChat] API error ${p.status}: ${v}`)}return p.json()}async getChannelInfo(){return this.request("GET","/channel-info")}async initConversation(a){return this.request("POST","/conversations",{...a,channelToken:this.channelToken})}async getConversation(a){return this.request("GET",`/conversations/${a}`)}async getMessages(a,h){let d=new URLSearchParams;h?.limit&&d.set("limit",String(h.limit)),h?.page&&d.set("page",String(h.page));let p=d.toString()?`?${d.toString()}`:"";return this.request("GET",`/conversations/${a}/messages${p}`)}async uploadFile(a,h){let d=new FormData;d.append("file",h);let p={"x-channel-token":this.channelToken};this.visitorEmail&&(p["x-visitor-email"]=this.visitorEmail),this.visitorHash&&(p["x-visitor-hash"]=this.visitorHash);let v=await fetch(`${this.baseUrl}/conversations/${a}/upload`,{method:"POST",headers:p,body:d});if(!v.ok){let A=await v.text().catch(()=>"");throw new Error(`[BaseportalChat] Upload error ${v.status}: ${A}`)}return v.json()}async sendMessage(a,h){return this.request("POST",`/conversations/${a}/messages`,h)}async getVisitorConversations(){return this.request("GET","/conversations")}async reopenConversation(a){return this.request("POST",`/conversations/${a}/reopen`)}async getAblyToken(a){return this.request("POST","/ably-token",{conversationId:a})}};var Us=vc(Ls()),$t=class{constructor(a){this.client=null;this.channel=null;this.conversationId=null;this.handlers=null;this.apiClient=a}async subscribe(a,h){this.unsubscribe(),this.conversationId=a,this.handlers=h;try{let d=await this.apiClient.getAblyToken(a);this.client=new Us.Realtime({authCallback:(v,A)=>{A(null,d)},clientId:`visitor-${a}`});let p=`conversation-${a}`;this.channel=this.client.channels.get(p),this.channel.subscribe(v=>{if(v.data)try{let A=typeof v.data=="string"?JSON.parse(v.data):v.data;A.text==="conversation_status_updated"&&A.metadata?h.onConversationStatusUpdate(A.metadata):A.text==="created_or_updated_message"&&A.metadata&&h.onMessage(A.metadata)}catch(A){console.error("[BaseportalChat] Error parsing realtime message:",A)}})}catch(d){console.error("[BaseportalChat] Error connecting to realtime:",d)}}unsubscribe(){this.channel&&(this.channel.unsubscribe(),this.channel=null),this.client&&(this.client.close(),this.client=null),this.conversationId=null,this.handlers=null}isConnected(){return this.client?.connection.state==="connected"}};var bc={prechat:{title:"Iniciar conversa",description:"Preencha os dados abaixo para iniciar o atendimento.",name:"Nome",namePlaceholder:"Seu nome",email:"E-mail",emailPlaceholder:"seu@email.com",start:"Iniciar conversa",loading:"Iniciando...",privacyPrefix:"Ao enviar, voc\xEA concorda com nossa",privacyLink:"Pol\xEDtica de Privacidade"},chat:{placeholder:"Digite uma mensagem...",closed:"Esta conversa foi encerrada.",reopen:"Reabrir conversa",newConversation:"Nova conversa",attachFile:"Anexar arquivo",uploading:"Enviando...",fileTooLarge:"Arquivo muito grande (m\xE1x. 25MB)",download:"Baixar"},conversations:{title:"Atendimento",newConversation:"Nova conversa",empty:"Nenhuma conversa encontrada.",open:"Aberta",closed:"Fechada",noMessages:"Nenhuma mensagem ainda"}},wc={prechat:{title:"Start a conversation",description:"Fill in the details below to start chatting.",name:"Name",namePlaceholder:"Your name",email:"Email",emailPlaceholder:"you@email.com",start:"Start conversation",loading:"Starting...",privacyPrefix:"By sending, you agree to our",privacyLink:"Privacy Policy"},chat:{placeholder:"Type a message...",closed:"This conversation has been closed.",reopen:"Reopen conversation",newConversation:"New conversation",attachFile:"Attach file",uploading:"Uploading...",fileTooLarge:"File too large (max 25MB)",download:"Download"},conversations:{title:"Support",newConversation:"New conversation",empty:"No conversations found.",open:"Open",closed:"Closed",noMessages:"No messages yet"}},Cc={prechat:{title:"Iniciar conversaci\xF3n",description:"Complete los datos a continuaci\xF3n para iniciar la atenci\xF3n.",name:"Nombre",namePlaceholder:"Tu nombre",email:"Correo electr\xF3nico",emailPlaceholder:"tu@email.com",start:"Iniciar conversaci\xF3n",loading:"Iniciando...",privacyPrefix:"Al enviar, aceptas nuestra",privacyLink:"Pol\xEDtica de Privacidad"},chat:{placeholder:"Escribe un mensaje...",closed:"Esta conversaci\xF3n ha sido cerrada.",reopen:"Reabrir conversaci\xF3n",newConversation:"Nueva conversaci\xF3n",attachFile:"Adjuntar archivo",uploading:"Subiendo...",fileTooLarge:"Archivo demasiado grande (m\xE1x. 25MB)",download:"Descargar"},conversations:{title:"Atenci\xF3n",newConversation:"Nueva conversaci\xF3n",empty:"No se encontraron conversaciones.",open:"Abierta",closed:"Cerrada",noMessages:"Sin mensajes a\xFAn"}},Ns={pt:bc,en:wc,es:Cc};function Bs(c){return Ns[c]||Ns.pt}var Zt,W,Fs,Rc,$e,Gs,js,Qn,Zn,Xn,Yn,kc,kt={},Ws=[],Ac=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ei=Array.isArray;function Fe(c,a){for(var h in a)c[h]=a[h];return c}function Vs(c){c&&c.parentNode&&c.parentNode.removeChild(c)}function ti(c,a,h){var d,p,v,A={};for(v in a)v=="key"?d=a[v]:v=="ref"?p=a[v]:A[v]=a[v];if(arguments.length>2&&(A.children=arguments.length>3?Zt.call(arguments,2):h),typeof c=="function"&&c.defaultProps!=null)for(v in c.defaultProps)A[v]===void 0&&(A[v]=c.defaultProps[v]);return Qt(c,A,d,p,null)}function Qt(c,a,h,d,p){var v={type:c,props:a,key:h,ref:d,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:p??++Fs,__i:-1,__u:0};return p==null&&W.vnode!=null&&W.vnode(v),v}function Oe(c){return c.children}function Xt(c,a){this.props=c,this.context=a}function ot(c,a){if(a==null)return c.__?ot(c.__,c.__i+1):null;for(var h;a<c.__k.length;a++)if((h=c.__k[a])!=null&&h.__e!=null)return h.__e;return typeof c.type=="function"?ot(c):null}function zs(c){var a,h;if((c=c.__)!=null&&c.__c!=null){for(c.__e=c.__c.base=null,a=0;a<c.__k.length;a++)if((h=c.__k[a])!=null&&h.__e!=null){c.__e=c.__c.base=h.__e;break}return zs(c)}}function qs(c){(!c.__d&&(c.__d=!0)&&$e.push(c)&&!Yt.__r++||Gs!==W.debounceRendering)&&((Gs=W.debounceRendering)||js)(Yt)}function Yt(){var c,a,h,d,p,v,A,T;for($e.sort(Qn);c=$e.shift();)c.__d&&(a=$e.length,d=void 0,v=(p=(h=c).__v).__e,A=[],T=[],h.__P&&((d=Fe({},p)).__v=p.__v+1,W.vnode&&W.vnode(d),ni(h.__P,d,p,h.__n,h.__P.namespaceURI,32&p.__u?[v]:null,A,v??ot(p),!!(32&p.__u),T),d.__v=p.__v,d.__.__k[d.__i]=d,Js(A,d,T),d.__e!=v&&zs(d)),$e.length>a&&$e.sort(Qn));Yt.__r=0}function Ks(c,a,h,d,p,v,A,T,M,k,P){var y,E,S,H,ne,K=d&&d.__k||Ws,F=a.length;for(h.__d=M,Oc(h,a,K),M=h.__d,y=0;y<F;y++)(S=h.__k[y])!=null&&(E=S.__i===-1?kt:K[S.__i]||kt,S.__i=y,ni(c,S,E,p,v,A,T,M,k,P),H=S.__e,S.ref&&E.ref!=S.ref&&(E.ref&&ii(E.ref,null,S),P.push(S.ref,S.__c||H,S)),ne==null&&H!=null&&(ne=H),65536&S.__u||E.__k===S.__k?M=$s(S,M,c):typeof S.type=="function"&&S.__d!==void 0?M=S.__d:H&&(M=H.nextSibling),S.__d=void 0,S.__u&=-196609);h.__d=M,h.__e=ne}function Oc(c,a,h){var d,p,v,A,T,M=a.length,k=h.length,P=k,y=0;for(c.__k=[],d=0;d<M;d++)(p=a[d])!=null&&typeof p!="boolean"&&typeof p!="function"?(A=d+y,(p=c.__k[d]=typeof p=="string"||typeof p=="number"||typeof p=="bigint"||p.constructor==String?Qt(null,p,null,null,null):ei(p)?Qt(Oe,{children:p},null,null,null):p.constructor===void 0&&p.__b>0?Qt(p.type,p.props,p.key,p.ref?p.ref:null,p.__v):p).__=c,p.__b=c.__b+1,v=null,(T=p.__i=Sc(p,h,A,P))!==-1&&(P--,(v=h[T])&&(v.__u|=131072)),v==null||v.__v===null?(T==-1&&y--,typeof p.type!="function"&&(p.__u|=65536)):T!==A&&(T==A-1?y--:T==A+1?y++:(T>A?y--:y++,p.__u|=65536))):p=c.__k[d]=null;if(P)for(d=0;d<k;d++)(v=h[d])!=null&&!(131072&v.__u)&&(v.__e==c.__d&&(c.__d=ot(v)),Qs(v,v))}function $s(c,a,h){var d,p;if(typeof c.type=="function"){for(d=c.__k,p=0;d&&p<d.length;p++)d[p]&&(d[p].__=c,a=$s(d[p],a,h));return a}c.__e!=a&&(a&&c.type&&!h.contains(a)&&(a=ot(c)),h.insertBefore(c.__e,a||null),a=c.__e);do a=a&&a.nextSibling;while(a!=null&&a.nodeType===8);return a}function Sc(c,a,h,d){var p=c.key,v=c.type,A=h-1,T=h+1,M=a[h];if(M===null||M&&p==M.key&&v===M.type&&!(131072&M.__u))return h;if((typeof v!="function"||v===Oe||p)&&d>(M!=null&&!(131072&M.__u)?1:0))for(;A>=0||T<a.length;){if(A>=0){if((M=a[A])&&!(131072&M.__u)&&p==M.key&&v===M.type)return A;A--}if(T<a.length){if((M=a[T])&&!(131072&M.__u)&&p==M.key&&v===M.type)return T;T++}}return-1}function Ds(c,a,h){a[0]==="-"?c.setProperty(a,h??""):c[a]=h==null?"":typeof h!="number"||Ac.test(a)?h:h+"px"}function Jt(c,a,h,d,p){var v;e:if(a==="style")if(typeof h=="string")c.style.cssText=h;else{if(typeof d=="string"&&(c.style.cssText=d=""),d)for(a in d)h&&a in h||Ds(c.style,a,"");if(h)for(a in h)d&&h[a]===d[a]||Ds(c.style,a,h[a])}else if(a[0]==="o"&&a[1]==="n")v=a!==(a=a.replace(/(PointerCapture)$|Capture$/i,"$1")),a=a.toLowerCase()in c||a==="onFocusOut"||a==="onFocusIn"?a.toLowerCase().slice(2):a.slice(2),c.l||(c.l={}),c.l[a+v]=h,h?d?h.u=d.u:(h.u=Zn,c.addEventListener(a,v?Yn:Xn,v)):c.removeEventListener(a,v?Yn:Xn,v);else{if(p=="http://www.w3.org/2000/svg")a=a.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(a!="width"&&a!="height"&&a!="href"&&a!="list"&&a!="form"&&a!="tabIndex"&&a!="download"&&a!="rowSpan"&&a!="colSpan"&&a!="role"&&a!="popover"&&a in c)try{c[a]=h??"";break e}catch{}typeof h=="function"||(h==null||h===!1&&a[4]!=="-"?c.removeAttribute(a):c.setAttribute(a,a=="popover"&&h==1?"":h))}}function Hs(c){return function(a){if(this.l){var h=this.l[a.type+c];if(a.t==null)a.t=Zn++;else if(a.t<h.u)return;return W.event&&(a=W.event(a)),"handleEvent"in h?h.handleEvent(a):h(a)}}}function ni(c,a,h,d,p,v,A,T,M,k){var P,y,E,S,H,ne,K,F,m,V,Q,pe,le,he,Pe,o,re=a.type;if(a.constructor!==void 0)return null;128&h.__u&&(M=!!(32&h.__u),v=[T=a.__e=h.__e]),(P=W.__b)&&P(a);e:if(typeof re=="function")try{if(F=a.props,m="prototype"in re&&re.prototype.render,V=(P=re.contextType)&&d[P.__c],Q=P?V?V.props.value:P.__:d,h.__c?K=(y=a.__c=h.__c).__=y.__E:(m?a.__c=y=new re(F,Q):(a.__c=y=new Xt(F,Q),y.constructor=re,y.render=Mc),V&&V.sub(y),y.props=F,y.state||(y.state={}),y.context=Q,y.__n=d,E=y.__d=!0,y.__h=[],y._sb=[]),m&&y.__s==null&&(y.__s=y.state),m&&re.getDerivedStateFromProps!=null&&(y.__s==y.state&&(y.__s=Fe({},y.__s)),Fe(y.__s,re.getDerivedStateFromProps(F,y.__s))),S=y.props,H=y.state,y.__v=a,E)m&&re.getDerivedStateFromProps==null&&y.componentWillMount!=null&&y.componentWillMount(),m&&y.componentDidMount!=null&&y.__h.push(y.componentDidMount);else{if(m&&re.getDerivedStateFromProps==null&&F!==S&&y.componentWillReceiveProps!=null&&y.componentWillReceiveProps(F,Q),!y.__e&&(y.shouldComponentUpdate!=null&&y.shouldComponentUpdate(F,y.__s,Q)===!1||a.__v===h.__v)){for(a.__v!==h.__v&&(y.props=F,y.state=y.__s,y.__d=!1),a.__e=h.__e,a.__k=h.__k,a.__k.some(function(Se){Se&&(Se.__=a)}),pe=0;pe<y._sb.length;pe++)y.__h.push(y._sb[pe]);y._sb=[],y.__h.length&&A.push(y);break e}y.componentWillUpdate!=null&&y.componentWillUpdate(F,y.__s,Q),m&&y.componentDidUpdate!=null&&y.__h.push(function(){y.componentDidUpdate(S,H,ne)})}if(y.context=Q,y.props=F,y.__P=c,y.__e=!1,le=W.__r,he=0,m){for(y.state=y.__s,y.__d=!1,le&&le(a),P=y.render(y.props,y.state,y.context),Pe=0;Pe<y._sb.length;Pe++)y.__h.push(y._sb[Pe]);y._sb=[]}else do y.__d=!1,le&&le(a),P=y.render(y.props,y.state,y.context),y.state=y.__s;while(y.__d&&++he<25);y.state=y.__s,y.getChildContext!=null&&(d=Fe(Fe({},d),y.getChildContext())),m&&!E&&y.getSnapshotBeforeUpdate!=null&&(ne=y.getSnapshotBeforeUpdate(S,H)),Ks(c,ei(o=P!=null&&P.type===Oe&&P.key==null?P.props.children:P)?o:[o],a,h,d,p,v,A,T,M,k),y.base=a.__e,a.__u&=-161,y.__h.length&&A.push(y),K&&(y.__E=y.__=null)}catch(Se){if(a.__v=null,M||v!=null){for(a.__u|=M?160:128;T&&T.nodeType===8&&T.nextSibling;)T=T.nextSibling;v[v.indexOf(T)]=null,a.__e=T}else a.__e=h.__e,a.__k=h.__k;W.__e(Se,a,h)}else v==null&&a.__v===h.__v?(a.__k=h.__k,a.__e=h.__e):a.__e=Tc(h.__e,a,h,d,p,v,A,M,k);(P=W.diffed)&&P(a)}function Js(c,a,h){a.__d=void 0;for(var d=0;d<h.length;d++)ii(h[d],h[++d],h[++d]);W.__c&&W.__c(a,c),c.some(function(p){try{c=p.__h,p.__h=[],c.some(function(v){v.call(p)})}catch(v){W.__e(v,p.__v)}})}function Tc(c,a,h,d,p,v,A,T,M){var k,P,y,E,S,H,ne,K=h.props,F=a.props,m=a.type;if(m==="svg"?p="http://www.w3.org/2000/svg":m==="math"?p="http://www.w3.org/1998/Math/MathML":p||(p="http://www.w3.org/1999/xhtml"),v!=null){for(k=0;k<v.length;k++)if((S=v[k])&&"setAttribute"in S==!!m&&(m?S.localName===m:S.nodeType===3)){c=S,v[k]=null;break}}if(c==null){if(m===null)return document.createTextNode(F);c=document.createElementNS(p,m,F.is&&F),T&&(W.__m&&W.__m(a,v),T=!1),v=null}if(m===null)K===F||T&&c.data===F||(c.data=F);else{if(v=v&&Zt.call(c.childNodes),K=h.props||kt,!T&&v!=null)for(K={},k=0;k<c.attributes.length;k++)K[(S=c.attributes[k]).name]=S.value;for(k in K)if(S=K[k],k!="children"){if(k=="dangerouslySetInnerHTML")y=S;else if(!(k in F)){if(k=="value"&&"defaultValue"in F||k=="checked"&&"defaultChecked"in F)continue;Jt(c,k,null,S,p)}}for(k in F)S=F[k],k=="children"?E=S:k=="dangerouslySetInnerHTML"?P=S:k=="value"?H=S:k=="checked"?ne=S:T&&typeof S!="function"||K[k]===S||Jt(c,k,S,K[k],p);if(P)T||y&&(P.__html===y.__html||P.__html===c.innerHTML)||(c.innerHTML=P.__html),a.__k=[];else if(y&&(c.innerHTML=""),Ks(c,ei(E)?E:[E],a,h,d,m==="foreignObject"?"http://www.w3.org/1999/xhtml":p,v,A,v?v[0]:h.__k&&ot(h,0),T,M),v!=null)for(k=v.length;k--;)Vs(v[k]);T||(k="value",m==="progress"&&H==null?c.removeAttribute("value"):H!==void 0&&(H!==c[k]||m==="progress"&&!H||m==="option"&&H!==K[k])&&Jt(c,k,H,K[k],p),k="checked",ne!==void 0&&ne!==c[k]&&Jt(c,k,ne,K[k],p))}return c}function ii(c,a,h){try{if(typeof c=="function"){var d=typeof c.__u=="function";d&&c.__u(),d&&a==null||(c.__u=c(a))}else c.current=a}catch(p){W.__e(p,h)}}function Qs(c,a,h){var d,p;if(W.unmount&&W.unmount(c),(d=c.ref)&&(d.current&&d.current!==c.__e||ii(d,null,a)),(d=c.__c)!=null){if(d.componentWillUnmount)try{d.componentWillUnmount()}catch(v){W.__e(v,a)}d.base=d.__P=null}if(d=c.__k)for(p=0;p<d.length;p++)d[p]&&Qs(d[p],a,h||typeof c.type!="function");h||Vs(c.__e),c.__c=c.__=c.__e=c.__d=void 0}function Mc(c,a,h){return this.constructor(c,h)}function si(c,a,h){var d,p,v,A;W.__&&W.__(c,a),p=(d=typeof h=="function")?null:h&&h.__k||a.__k,v=[],A=[],ni(a,c=(!d&&h||a).__k=ti(Oe,null,[c]),p||kt,kt,a.namespaceURI,!d&&h?[h]:p?null:a.firstChild?Zt.call(a.childNodes):null,v,!d&&h?h:p?p.__e:a.firstChild,d,A),Js(v,c,A)}Zt=Ws.slice,W={__e:function(c,a,h,d){for(var p,v,A;a=a.__;)if((p=a.__c)&&!p.__)try{if((v=p.constructor)&&v.getDerivedStateFromError!=null&&(p.setState(v.getDerivedStateFromError(c)),A=p.__d),p.componentDidCatch!=null&&(p.componentDidCatch(c,d||{}),A=p.__d),A)return p.__E=p}catch(T){c=T}throw c}},Fs=0,Rc=function(c){return c!=null&&c.constructor==null},Xt.prototype.setState=function(c,a){var h;h=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=Fe({},this.state),typeof c=="function"&&(c=c(Fe({},h),this.props)),c&&Fe(h,c),c!=null&&this.__v&&(a&&this._sb.push(a),qs(this))},Xt.prototype.forceUpdate=function(c){this.__v&&(this.__e=!0,c&&this.__h.push(c),qs(this))},Xt.prototype.render=Oe,$e=[],js=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Qn=function(c,a){return c.__v.__b-a.__v.__b},Yt.__r=0,Zn=0,Xn=Hs(!1),Yn=Hs(!0),kc=0;var At,te,ri,Xs,Ot=0,rr=[],ie=W,Ys=ie.__b,Zs=ie.__r,er=ie.diffed,tr=ie.__c,nr=ie.unmount,ir=ie.__;function ai(c,a){ie.__h&&ie.__h(te,c,Ot||a),Ot=0;var h=te.__H||(te.__H={__:[],__h:[]});return c>=h.__.length&&h.__.push({}),h.__[c]}function se(c){return Ot=1,xc(cr,c)}function xc(c,a,h){var d=ai(At++,2);if(d.t=c,!d.__c&&(d.__=[h?h(a):cr(void 0,a),function(T){var M=d.__N?d.__N[0]:d.__[0],k=d.t(M,T);M!==k&&(d.__N=[k,d.__[1]],d.__c.setState({}))}],d.__c=te,!te.u)){var p=function(T,M,k){if(!d.__c.__H)return!0;var P=d.__c.__H.__.filter(function(E){return!!E.__c});if(P.every(function(E){return!E.__N}))return!v||v.call(this,T,M,k);var y=d.__c.props!==T;return P.forEach(function(E){if(E.__N){var S=E.__[0];E.__=E.__N,E.__N=void 0,S!==E.__[0]&&(y=!0)}}),v&&v.call(this,T,M,k)||y};te.u=!0;var v=te.shouldComponentUpdate,A=te.componentWillUpdate;te.componentWillUpdate=function(T,M,k){if(this.__e){var P=v;v=void 0,p(T,M,k),v=P}A&&A.call(this,T,M,k)},te.shouldComponentUpdate=p}return d.__N||d.__}function je(c,a){var h=ai(At++,3);!ie.__s&&ar(h.__H,a)&&(h.__=c,h.i=a,te.__H.__h.push(h))}function Je(c){return Ot=5,or(function(){return{current:c}},[])}function or(c,a){var h=ai(At++,7);return ar(h.__H,a)&&(h.__=c(),h.__H=a,h.__h=c),h.__}function ae(c,a){return Ot=8,or(function(){return c},a)}function Ic(){for(var c;c=rr.shift();)if(c.__P&&c.__H)try{c.__H.__h.forEach(en),c.__H.__h.forEach(oi),c.__H.__h=[]}catch(a){c.__H.__h=[],ie.__e(a,c.__v)}}ie.__b=function(c){te=null,Ys&&Ys(c)},ie.__=function(c,a){c&&a.__k&&a.__k.__m&&(c.__m=a.__k.__m),ir&&ir(c,a)},ie.__r=function(c){Zs&&Zs(c),At=0;var a=(te=c.__c).__H;a&&(ri===te?(a.__h=[],te.__h=[],a.__.forEach(function(h){h.__N&&(h.__=h.__N),h.i=h.__N=void 0})):(a.__h.forEach(en),a.__h.forEach(oi),a.__h=[],At=0)),ri=te},ie.diffed=function(c){er&&er(c);var a=c.__c;a&&a.__H&&(a.__H.__h.length&&(rr.push(a)!==1&&Xs===ie.requestAnimationFrame||((Xs=ie.requestAnimationFrame)||Ec)(Ic)),a.__H.__.forEach(function(h){h.i&&(h.__H=h.i),h.i=void 0})),ri=te=null},ie.__c=function(c,a){a.some(function(h){try{h.__h.forEach(en),h.__h=h.__h.filter(function(d){return!d.__||oi(d)})}catch(d){a.some(function(p){p.__h&&(p.__h=[])}),a=[],ie.__e(d,h.__v)}}),tr&&tr(c,a)},ie.unmount=function(c){nr&&nr(c);var a,h=c.__c;h&&h.__H&&(h.__H.__.forEach(function(d){try{en(d)}catch(p){a=p}}),h.__H=void 0,a&&ie.__e(a,h.__v))};var sr=typeof requestAnimationFrame=="function";function Ec(c){var a,h=function(){clearTimeout(d),sr&&cancelAnimationFrame(a),setTimeout(c)},d=setTimeout(h,100);sr&&(a=requestAnimationFrame(h))}function en(c){var a=te,h=c.__c;typeof h=="function"&&(c.__c=void 0,h()),te=a}function oi(c){var a=te;c.__c=c.__(),te=a}function ar(c,a){return!c||c.length!==a.length||a.some(function(h,d){return h!==c[d]})}function cr(c,a){return typeof a=="function"?a(c):a}var Pc=0,Ul=Array.isArray;function _(c,a,h,d,p,v){a||(a={});var A,T,M=a;"ref"in a&&(A=a.ref,delete a.ref);var k={type:c,props:M,key:h,ref:A,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:--Pc,__i:-1,__u:0,__source:p,__self:v};if(typeof c=="function"&&(A=c.defaultProps))for(T in A)M[T]===void 0&&(M[T]=A[T]);return W.vnode&&W.vnode(k),k}var lr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:_("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}),We=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),_("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]}),hr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"19",y1:"12",x2:"5",y2:"12"}),_("polyline",{points:"12 19 5 12 12 5"})]}),ur=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),_("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]}),dr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),_("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]}),fr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:_("path",{d:"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"})}),pr=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"}),_("polyline",{points:"7 10 12 15 17 10"}),_("line",{x1:"12",y1:"15",x2:"12",y2:"3"})]}),tn=()=>_("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",children:[_("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),_("polyline",{points:"14 2 14 8 20 8"})]});function gr({isOpen:c,position:a,unreadCount:h,onClick:d}){return _("button",{class:`bp-bubble ${a==="bottom-left"?"bp-bubble--left":"bp-bubble--right"}`,onClick:d,"aria-label":c?"Close chat":"Open chat",children:[c?_(We,{}):_(lr,{}),!c&&h>0&&_("span",{class:"bp-bubble__badge",children:h>99?"99+":h})]})}function mr({conversations:c,channelInfo:a,loading:h,onSelect:d,onNew:p,t:v}){let A=c.some(M=>M.open),T=a.config.allowReopenConversation;return h?_("div",{class:"bp-loading",children:_("div",{class:"bp-spinner"})}):_("div",{class:"bp-convlist",children:[!A&&_("div",{class:"bp-convlist__new",children:_("button",{class:"bp-convlist__new-btn",onClick:p,children:[_(dr,{}),v.conversations.newConversation]})}),_("div",{class:"bp-convlist__items",children:c.length===0?_("div",{class:"bp-convlist__empty",children:v.conversations.empty}):c.map(M=>{let k=M.open||T;return _("button",{class:"bp-convlist__item",onClick:()=>k&&d(M),disabled:!k,children:[_("div",{class:"bp-convlist__item-top",children:[_("span",{class:"bp-convlist__item-title",children:a.name}),_("span",{class:`bp-convlist__item-status ${M.open?"bp-convlist__item-status--open":"bp-convlist__item-status--closed"}`,children:M.open?v.conversations.open:v.conversations.closed})]}),_("span",{class:"bp-convlist__item-preview",children:M.lastMessage?.content||v.conversations.noMessages})]},M.id)})})]})}function yr({value:c,onChange:a,onSend:h,onFileSelect:d,onFileRemove:p,attachedFile:v,uploading:A,disabled:T,placeholder:M,t:k}){let P=Je(null),y=Je(null),E=ae(m=>{m.key==="Enter"&&!m.shiftKey&&(m.preventDefault(),h())},[h]),S=ae(m=>{let V=m.target;a(V.value),V.style.height="auto",V.style.height=`${Math.min(V.scrollHeight,100)}px`},[a]),H=ae(()=>{y.current?.click()},[]),ne=ae(m=>{let V=m.target,Q=V.files?.[0];Q&&d(Q),V.value=""},[d]),K=v?.file.type.startsWith("image/"),F=(c.trim()||v)&&!T&&!A;return _("div",{class:"bp-composer",children:[v&&_("div",{class:"bp-composer__preview",children:[K&&v.preview?_("img",{src:v.preview,alt:v.file.name,class:"bp-composer__preview-thumb"}):_("div",{class:"bp-composer__preview-icon",children:_(tn,{})}),_("div",{class:"bp-composer__preview-info",children:[_("div",{class:"bp-composer__preview-name",children:v.file.name}),_("div",{class:"bp-composer__preview-status",children:A?k.chat.uploading:Lc(v.file.size)})]}),!A&&_("button",{class:"bp-composer__preview-remove",onClick:p,"aria-label":"Remove file",children:_(We,{})})]}),_("div",{class:"bp-composer__row",children:[_("button",{class:"bp-composer__attach",onClick:H,disabled:T||A||!!v,"aria-label":k.chat.attachFile,children:_(fr,{})}),_("textarea",{ref:P,class:"bp-composer__field",value:c,onInput:S,onKeyDown:E,placeholder:M||k.chat.placeholder,disabled:T,rows:1}),_("button",{class:"bp-composer__send",onClick:h,disabled:!F,"aria-label":"Send message",children:_(ur,{})})]}),_("input",{type:"file",ref:y,onChange:ne,style:{display:"none"},accept:"image/*,video/mp4,audio/*,.pdf,.doc,.docx,.xls,.xlsx,.txt"})]})}function Lc(c){return c<1024?`${c} B`:c<1024*1024?`${(c/1024).toFixed(0)} KB`:`${(c/(1024*1024)).toFixed(1)} MB`}function vr({src:c,alt:a,onClose:h}){let d=ae(p=>{p.key==="Escape"&&h()},[h]);return je(()=>(document.addEventListener("keydown",d),()=>document.removeEventListener("keydown",d)),[d]),_("div",{class:"bp-lightbox",onClick:h,children:[_("button",{class:"bp-lightbox__close",onClick:h,children:_(We,{})}),_("img",{src:c,alt:a||"",class:"bp-lightbox__img",onClick:p=>p.stopPropagation()})]})}function _r({media:c,onImageClick:a,t:h}){let d=(c.mimeType||"").toLowerCase();if(d.startsWith("image/")||c.kind==="image"){let p=c.streamUrlData?.small||c.url,v=c.streamUrlData?.large||c.url;return _("img",{src:p,alt:c.name,class:"bp-media-img",onClick:()=>a(v)})}return d.startsWith("video/")?_("video",{controls:!0,class:"bp-media-video",preload:"metadata",children:_("source",{src:c.url,type:d})}):_("a",{href:c.url,target:"_blank",rel:"noopener noreferrer",class:"bp-media-file",download:c.name,children:[_("div",{class:"bp-media-file__icon",children:_(tn,{})}),_("span",{class:"bp-media-file__name",children:c.name}),_("span",{class:"bp-media-file__download",children:_(pr,{})})]})}function br({messages:c,loading:a,t:h}){let d=Je(null),[p,v]=se(null);return je(()=>{d.current?.scrollIntoView({behavior:"smooth"})},[c]),a?_("div",{class:"bp-loading",children:_("div",{class:"bp-spinner"})}):_("div",{class:"bp-messages",children:[c.map(A=>_(Uc,{message:A,onImageClick:v,t:h},A.id)),_("div",{ref:d}),p&&_(vr,{src:p,onClose:()=>v(null)})]})}function Uc({message:c,onImageClick:a,t:h}){let d=c.role==="client",p=d?"bp-msg bp-msg--client":"bp-msg bp-msg--agent",v=new Date(c.createdAt).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});return _("div",{class:p,children:[!d&&_("div",{class:"bp-msg__avatar",children:c.user?.avatar?.url?_("img",{src:c.user.avatar.url,alt:c.user.firstName||"Agent"}):(c.user?.firstName?.[0]||"A").toUpperCase()}),_("div",{class:"bp-msg__body",children:[c.media&&_(_r,{media:c.media,onImageClick:a,t:h}),c.content&&_("div",{class:"bp-msg__content",children:c.content}),_("div",{class:"bp-msg__time",children:v})]})]})}function wr({channelInfo:c,onSubmit:a,loading:h,t:d}){let[p,v]=se(""),[A,T]=se(""),{requireName:M,requireEmail:k,privacyPolicyUrl:P}=c.config,y=S=>{S.preventDefault(),a({name:p.trim()||void 0,email:A.trim()||void 0})},E=(!M||p.trim())&&(!k||A.trim());return _("form",{class:"bp-prechat",onSubmit:y,children:[_("div",{class:"bp-prechat__title",children:d.prechat.title}),_("div",{class:"bp-prechat__desc",children:d.prechat.description}),M&&_("div",{class:"bp-prechat__field",children:[_("label",{class:"bp-prechat__label",children:d.prechat.name}),_("input",{class:"bp-prechat__input",type:"text",value:p,onInput:S=>v(S.target.value),placeholder:d.prechat.namePlaceholder,required:!0})]}),k&&_("div",{class:"bp-prechat__field",children:[_("label",{class:"bp-prechat__label",children:d.prechat.email}),_("input",{class:"bp-prechat__input",type:"email",value:A,onInput:S=>T(S.target.value),placeholder:d.prechat.emailPlaceholder,required:!0})]}),_("button",{class:"bp-prechat__submit",type:"submit",disabled:!E||h,children:h?d.prechat.loading:d.prechat.start}),P&&_("div",{class:"bp-prechat__privacy",children:[d.prechat.privacyPrefix," ",_("a",{href:P,target:"_blank",rel:"noopener noreferrer",children:d.prechat.privacyLink})]})]})}function Cr({channelInfo:c,apiClient:a,realtimeClient:h,storage:d,events:p,visitor:v,isAuthenticated:A,position:T,onClose:M,t:k,initialConversationId:P}){let[y,E]=se("chat"),[S,H]=se(null),[ne,K]=se([]),[F,m]=se([]),[V,Q]=se(""),[pe,le]=se(!0),[he,Pe]=se(!1),[o,re]=se(null),[Se,w]=se(null),[ce,Tt]=se(!1),G=S?.open!==!1,ge=c.config.allowViewHistory&&A,ct=Je(async()=>{});je(()=>((async()=>{le(!0);try{if(ge){let N=await a.getVisitorConversations();if(K(N),P){let X=N.find(ve=>ve.id===P);if(X){await ye(X);return}}N.length>0?E("conversations"):me()?E("prechat"):await ze()}else{let N=P||d.getConversationId();if(N)try{let X=await a.getConversation(N),ve=await a.getMessages(N,{limit:50});m(Array.isArray(ve)?ve.reverse():[]),H(X),E("chat"),X.open&&Le(N)}catch{d.clear(),me()?E("prechat"):await ze()}else me()?E("prechat"):await ze()}}catch(N){console.error("[BaseportalChat] Error initializing:",N)}finally{le(!1)}})(),()=>{h.unsubscribe()}),[]);let me=ae(()=>v?.name&&v?.email?!1:c.config.requireName||c.config.requireEmail,[c,v]),Le=ae(D=>{h.subscribe(D,{onMessage:N=>{m(X=>X.some(Y=>Y.id===N.id)?X.map(Y=>Y.id===N.id?{...Y,...N}:Y):[...X.filter(Y=>!String(Y.id).startsWith("temp-")||Y.content!==N.content),N]),p.emit("message:received",N)},onConversationStatusUpdate:N=>{H(X=>X&&{...X,open:N.open}),N.open||p.emit("conversation:closed",N)}})},[h,p,d,ge,a,me]),ye=ae(async D=>{le(!0);try{let N=await a.getMessages(D.id,{limit:50});m(Array.isArray(N)?N.reverse():[]),H(D),E("chat"),d.setConversationId(D.id),Le(D.id)}catch(N){console.error("[BaseportalChat] Error opening conversation:",N)}finally{le(!1)}},[a,d,Le]),ze=ae(async()=>{le(!0);try{let D=await a.initConversation({name:v?.name,email:v?.email});H(D),m(D.messages||[]),E("chat"),d.setConversationId(D.id),Le(D.id),p.emit("conversation:started",D)}catch(D){console.error("[BaseportalChat] Error starting conversation:",D)}finally{le(!1)}},[a,v,d,Le,p]);ct.current=ze;let Mt=ae(async D=>{d.setVisitor({...v,...D});let N=await a.initConversation(D);H(N),m(N.messages||[]),E("chat"),d.setConversationId(N.id),Le(N.id),p.emit("conversation:started",N)},[a,v,d,Le,p]),sn=ae(async D=>{if(!S)return;let N=25*1024*1024;if(D.size>N){console.warn("[BaseportalChat] File too large");return}let X=D.type.startsWith("image/")?URL.createObjectURL(D):void 0;re({file:D,preview:X}),Tt(!0);try{let ve=await a.uploadFile(S.id,D);w(ve.id)}catch(ve){console.error("[BaseportalChat] Error uploading file:",ve),re(null),X&&URL.revokeObjectURL(X)}finally{Tt(!1)}},[a,S]),rn=ae(()=>{o?.preview&&URL.revokeObjectURL(o.preview),re(null),w(null)},[o]),xt=ae(async()=>{let D=V.trim();if(!D&&!Se||!S||he)return;let N=`temp-${Date.now()}`,X={id:N,content:D,role:"client",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},ve=Se||void 0;Q(""),re(null),w(null),Pe(!0),m(Y=>[...Y,X]);try{let Y=await a.sendMessage(S.id,{content:D||void 0,mediaId:ve});m(Te=>Te.map(we=>we.id===N?Y:we)),p.emit("message:sent",Y)}catch(Y){console.error("[BaseportalChat] Error sending message:",Y),m(we=>we.filter(lt=>lt.id!==N));let Te=Y instanceof Error?Y.message:"";Te.includes("Row not found")||Te.includes("404")?(h.unsubscribe(),H(we=>we&&{...we,open:!1})):Q(D)}finally{Pe(!1)}},[V,Se,S,he,a,p,h,d,ge,me]),It=ae(async()=>{h.unsubscribe(),d.clear(),H(null),m([]),ge?(a.getVisitorConversations().then(K).catch(()=>{}),E("conversations")):me()?E("prechat"):await ct.current()},[h,d,ge,a,me]),Et=ae(async()=>{if(S)try{let D=await a.reopenConversation(S.id);H(N=>N&&{...N,open:D.open??!0})}catch(D){console.error("[BaseportalChat] Error reopening conversation:",D)}},[S,a]),on=ae(()=>{ge&&y==="chat"?(h.unsubscribe(),E("conversations"),H(null),m([]),a.getVisitorConversations().then(K).catch(()=>{})):M()},[ge,y,h,a,M]),Pt=T==="bottom-left"?"bp-window--left":"bp-window--right",an=y==="conversations"?k.conversations.title:c.name,Ke=ge&&y==="chat"||y==="prechat";return _("div",{class:`bp-window ${Pt}`,children:[_("div",{class:"bp-header",children:[_("div",{class:"bp-header__title",children:[Ke&&_("button",{class:"bp-header__back",onClick:on,children:_(hr,{})}),an]}),_("button",{class:"bp-header__close",onClick:M,children:_(We,{})})]}),pe&&y!=="chat"?_("div",{class:"bp-loading",children:_("div",{class:"bp-spinner"})}):_(Oe,{children:[y==="prechat"&&_(wr,{channelInfo:c,onSubmit:Mt,loading:pe,t:k}),y==="conversations"&&_(mr,{conversations:ne,channelInfo:c,loading:pe,onSelect:ye,onNew:me()?()=>E("prechat"):ze,t:k}),y==="chat"&&_(Oe,{children:[_(br,{messages:F,loading:pe,t:k}),G?_(yr,{value:V,onChange:Q,onSend:xt,onFileSelect:sn,onFileRemove:rn,attachedFile:o,uploading:ce,disabled:he||pe,placeholder:k.chat.placeholder,t:k}):_("div",{class:"bp-closed-banner",children:[_("span",{class:"bp-closed-banner__text",children:k.chat.closed}),c.config.allowReopenConversation?_("button",{class:"bp-closed-banner__reopen",onClick:Et,children:k.chat.reopen}):_("button",{class:"bp-closed-banner__reopen",onClick:It,children:k.chat.newConversation})]}),c.config.privacyPolicyUrl&&_("div",{class:"bp-privacy-footer",children:_("a",{href:c.config.privacyPolicyUrl,target:"_blank",rel:"noopener noreferrer",children:k.prechat.privacyLink})})]})]})]})}function Rr({channelInfo:c,apiClient:a,realtimeClient:h,storage:d,events:p,visitor:v,isAuthenticated:A,position:T,hidden:M,t:k,isOpenRef:P,setIsOpen:y}){let[E,S]=se(P.current),[H,ne]=se(M),[K]=se(0);return je(()=>{let V=()=>{S(!0),P.current=!0,y(!0)},Q=()=>{S(!1),P.current=!1,y(!1)},pe=()=>ne(!1),le=()=>{ne(!0),S(!1),P.current=!1,y(!1)};return p.on("_open",V),p.on("_close",Q),p.on("show",pe),p.on("hide",le),()=>{p.off("_open",V),p.off("_close",Q),p.off("show",pe),p.off("hide",le)}},[p,P,y]),_(Oe,{children:[!H&&_(gr,{isOpen:E,position:T,unreadCount:K,onClick:()=>{let V=!E;S(V),P.current=V,y(V),p.emit(V?"open":"close")}}),E&&_(Cr,{channelInfo:c,apiClient:a,realtimeClient:h,storage:d,events:p,visitor:v,isAuthenticated:A,position:T,onClose:()=>{S(!1),P.current=!1,y(!1),p.emit("close")},t:k})]})}var kr=`#baseportal-chat-widget {
10
10
  display: block;
11
11
  position: static;
12
12
  width: 0;
@@ -854,7 +854,7 @@
854
854
  .bp-hidden {
855
855
  display: none !important;
856
856
  }
857
- `;var We=null,Re=null;function Ar(c){We||(We=document.createElement("style"),We.id="baseportal-chat-styles",We.textContent=kr,document.head.appendChild(We)),Re=document.createElement("div"),Re.id="baseportal-chat-widget",(c.container||document.body).appendChild(Re);let h=c.channelInfo.theme?.primaryColor||"#6366f1",d=Or(h);Re.style.setProperty("--bp-primary",h),Re.style.setProperty("--bp-primary-contrast",d),si(ti(Rr,{channelInfo:c.channelInfo,apiClient:c.apiClient,realtimeClient:c.realtimeClient,storage:c.storage,events:c.events,visitor:c.visitor,isAuthenticated:c.isAuthenticated,position:c.position,hidden:c.hidden,t:c.t,isOpenRef:c.isOpenRef,setIsOpen:c.setIsOpen}),Re)}function ci(){Re&&(si(null,Re),Re.remove(),Re=null),We&&(We.remove(),We=null)}function li(c){Re&&(Re.style.setProperty("--bp-primary",c),Re.style.setProperty("--bp-primary-contrast",Or(c)))}function Or(c){let a=parseInt(c.slice(1,3),16),h=parseInt(c.slice(3,5),16),d=parseInt(c.slice(5,7),16);return(.299*a+.587*h+.114*d)/255>.5?"#000000":"#ffffff"}var nn=class{constructor(){this.listeners=new Map}on(a,h){this.listeners.has(a)||this.listeners.set(a,new Set),this.listeners.get(a).add(h)}off(a,h){this.listeners.get(a)?.delete(h)}emit(a,...h){this.listeners.get(a)?.forEach(d=>{try{d(...h)}catch(p){console.error(`[BaseportalChat] Error in ${a} handler:`,p)}})}removeAllListeners(){this.listeners.clear()}};var ct=class{constructor(a,h){this.prefix=h?`bp_chat_${a}_${h}`:`bp_chat_${a}`}get(){try{let a=localStorage.getItem(this.prefix);return a?JSON.parse(a):{}}catch{return{}}}set(a){try{let h=this.get();localStorage.setItem(this.prefix,JSON.stringify({...h,...a}))}catch{}}getConversationId(){return this.get().conversationId}setConversationId(a){this.set({conversationId:a})}getVisitor(){return this.get().visitor}setVisitor(a){this.set({visitor:a})}clear(){try{localStorage.removeItem(this.prefix)}catch{}}};var Nc="https://api.baseportal.io",St=class{constructor(a){this.events=new nn;this.channelInfo=null;this.visitor=null;this.isAuthenticated=!1;this.isOpenRef={current:!1};this.mounted=!1;this.config={...a,apiUrl:a.apiUrl||Nc,position:a.position||"bottom-right",locale:a.locale||"pt"},this.hidden=a.hideOnLoad||!1,this.visitor=a.visitor||null,this.isAuthenticated=!!a.visitor?.email,this.apiClient=new zt(this.config.channelToken,this.config.apiUrl),this.isAuthenticated&&this.visitor?.email&&this.apiClient.setVisitorIdentity(this.visitor.email,this.visitor.hash),this.storage=new ct(this.config.channelToken,this.isAuthenticated?this.visitor?.email:void 0),this.realtimeClient=new $t(this.apiClient),this.visitor||(this.visitor=this.storage.getVisitor()||null),this.init()}async init(){try{this.channelInfo=await this.apiClient.getChannelInfo();let a=this.config.theme?.primaryColor||this.channelInfo.theme?.primaryColor||"#6366f1",h=Bs(this.config.locale);Ar({channelInfo:this.channelInfo,apiClient:this.apiClient,realtimeClient:this.realtimeClient,storage:this.storage,events:this.events,visitor:this.visitor,isAuthenticated:this.isAuthenticated,position:this.config.position,hidden:this.hidden,t:h,container:this.config.container,isOpenRef:this.isOpenRef,setIsOpen:d=>{this.isOpenRef.current=d}}),a!=="#6366f1"&&li(a),this.mounted=!0,this.events.emit("ready")}catch(a){console.error("[BaseportalChat] Failed to initialize:",a)}}open(){this.mounted&&(this.events.emit("_open"),this.events.emit("open"))}close(){this.mounted&&(this.events.emit("_close"),this.events.emit("close"))}toggle(){this.isOpenRef.current?this.close():this.open()}show(){this.hidden=!1,this.events.emit("show")}hide(){this.hidden=!0,this.events.emit("hide")}isOpen(){return this.isOpenRef.current}identify(a){this.visitor=a,this.isAuthenticated=!0,this.apiClient.setVisitorIdentity(a.email,a.hash),this.storage=new ct(this.config.channelToken,a.email),this.storage.setVisitor(a),this.events.emit("identified",a),this.mounted&&this.remount()}updateVisitor(a){this.visitor&&(this.visitor={...this.visitor,...a},this.storage.setVisitor(this.visitor))}clearVisitor(){this.visitor=null,this.isAuthenticated=!1,this.apiClient.clearVisitorIdentity(),this.storage.clear(),this.storage=new ct(this.config.channelToken),this.realtimeClient.unsubscribe(),this.mounted&&this.remount()}sendMessage(a){this.events.emit("_sendMessage",a)}setConversationId(a){this.events.emit("_setConversationId",a)}newConversation(){this.events.emit("_newConversation")}setTheme(a){a.primaryColor&&li(a.primaryColor)}setPosition(a){this.config.position=a,this.mounted&&this.remount()}setLocale(a){this.config.locale=a,this.mounted&&this.remount()}on(a,h){this.events.on(a,h)}off(a,h){this.events.off(a,h)}destroy(){this.realtimeClient.unsubscribe(),this.events.removeAllListeners(),ci(),this.mounted=!1}remount(){ci(),this.mounted=!1,this.init()}};var Bc=St;return _c(Gc);})();
857
+ `;var Ve=null,ke=null;function Ar(c){Ve||(Ve=document.createElement("style"),Ve.id="baseportal-chat-styles",Ve.textContent=kr,document.head.appendChild(Ve)),ke=document.createElement("div"),ke.id="baseportal-chat-widget",(c.container||document.body).appendChild(ke);let h=c.channelInfo.theme?.primaryColor||"#6366f1",d=Or(h);ke.style.setProperty("--bp-primary",h),ke.style.setProperty("--bp-primary-contrast",d),si(ti(Rr,{channelInfo:c.channelInfo,apiClient:c.apiClient,realtimeClient:c.realtimeClient,storage:c.storage,events:c.events,visitor:c.visitor,isAuthenticated:c.isAuthenticated,position:c.position,hidden:c.hidden,t:c.t,isOpenRef:c.isOpenRef,setIsOpen:c.setIsOpen}),ke)}function ci(){ke&&(si(null,ke),ke.remove(),ke=null),Ve&&(Ve.remove(),Ve=null)}function li(c){ke&&(ke.style.setProperty("--bp-primary",c),ke.style.setProperty("--bp-primary-contrast",Or(c)))}function Or(c){let a=parseInt(c.slice(1,3),16),h=parseInt(c.slice(3,5),16),d=parseInt(c.slice(5,7),16);return(.299*a+.587*h+.114*d)/255>.5?"#000000":"#ffffff"}var nn=class{constructor(){this.listeners=new Map}on(a,h){this.listeners.has(a)||this.listeners.set(a,new Set),this.listeners.get(a).add(h)}off(a,h){this.listeners.get(a)?.delete(h)}emit(a,...h){this.listeners.get(a)?.forEach(d=>{try{d(...h)}catch(p){console.error(`[BaseportalChat] Error in ${a} handler:`,p)}})}removeAllListeners(){this.listeners.clear()}};var at=class{constructor(a,h){this.prefix=h?`bp_chat_${a}_${h}`:`bp_chat_${a}`}get(){try{let a=localStorage.getItem(this.prefix);return a?JSON.parse(a):{}}catch{return{}}}set(a){try{let h=this.get();localStorage.setItem(this.prefix,JSON.stringify({...h,...a}))}catch{}}getConversationId(){return this.get().conversationId}setConversationId(a){this.set({conversationId:a})}getVisitor(){return this.get().visitor}setVisitor(a){this.set({visitor:a})}clear(){try{localStorage.removeItem(this.prefix)}catch{}}};var Nc="https://api.baseportal.io",St=class{constructor(a){this.events=new nn;this.channelInfo=null;this.visitor=null;this.isAuthenticated=!1;this.isOpenRef={current:!1};this.mounted=!1;this.config={...a,apiUrl:a.apiUrl||Nc,position:a.position||"bottom-right",locale:a.locale||"pt"},this.hidden=a.hideOnLoad||!1,this.visitor=a.visitor||null,this.isAuthenticated=!!a.visitor?.email,this.apiClient=new zt(this.config.channelToken,this.config.apiUrl),this.isAuthenticated&&this.visitor?.email&&this.apiClient.setVisitorIdentity(this.visitor.email,this.visitor.hash),this.storage=new at(this.config.channelToken,this.isAuthenticated?this.visitor?.email:void 0),this.realtimeClient=new $t(this.apiClient),this.visitor||(this.visitor=this.storage.getVisitor()||null),this.init()}async init(){try{this.channelInfo=await this.apiClient.getChannelInfo();let a=this.config.theme?.primaryColor||this.channelInfo.theme?.primaryColor||"#6366f1",h=Bs(this.config.locale);Ar({channelInfo:this.channelInfo,apiClient:this.apiClient,realtimeClient:this.realtimeClient,storage:this.storage,events:this.events,visitor:this.visitor,isAuthenticated:this.isAuthenticated,position:this.config.position,hidden:this.hidden,t:h,container:this.config.container,isOpenRef:this.isOpenRef,setIsOpen:d=>{this.isOpenRef.current=d}}),a!=="#6366f1"&&li(a),this.mounted=!0,this.events.emit("ready")}catch(a){console.error("[BaseportalChat] Failed to initialize:",a)}}open(){this.mounted&&(this.events.emit("_open"),this.events.emit("open"))}close(){this.mounted&&(this.events.emit("_close"),this.events.emit("close"))}toggle(){this.isOpenRef.current?this.close():this.open()}show(){this.hidden=!1,this.events.emit("show")}hide(){this.hidden=!0,this.events.emit("hide")}isOpen(){return this.isOpenRef.current}identify(a){this.visitor=a,this.isAuthenticated=!0,this.apiClient.setVisitorIdentity(a.email,a.hash),this.storage=new at(this.config.channelToken,a.email),this.storage.setVisitor(a),this.events.emit("identified",a),this.mounted&&this.remount()}updateVisitor(a){this.visitor&&(this.visitor={...this.visitor,...a},this.storage.setVisitor(this.visitor))}clearVisitor(){this.visitor=null,this.isAuthenticated=!1,this.apiClient.clearVisitorIdentity(),this.storage.clear(),this.storage=new at(this.config.channelToken),this.realtimeClient.unsubscribe(),this.mounted&&this.remount()}sendMessage(a){this.events.emit("_sendMessage",a)}setConversationId(a){this.events.emit("_setConversationId",a)}newConversation(){this.events.emit("_newConversation")}setTheme(a){a.primaryColor&&li(a.primaryColor)}setPosition(a){this.config.position=a,this.mounted&&this.remount()}setLocale(a){this.config.locale=a,this.mounted&&this.remount()}on(a,h){this.events.on(a,h)}off(a,h){this.events.off(a,h)}destroy(){this.realtimeClient.unsubscribe(),this.events.removeAllListeners(),ci(),this.mounted=!1}remount(){ci(),this.mounted=!1,this.init()}};var Bc=St;return _c(Gc);})();
858
858
  /*! Bundled license information:
859
859
 
860
860
  ably/build/ably.js: