@talkjs/core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -0
- package/README.md +68 -0
- package/dist/talkSession.d.ts +2227 -0
- package/dist/talkSession.js +2 -0
- package/package.json +69 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){if(e.length!==t.length)return!1;for(let s=0;s<e.length;s++)if("*"!==t[s]&&e[s]!==t[s])return!1;return!0}function t(e,t){if(t.ok)return t.value.data;if("SESSION_DESTROYED"===t.value)throw new Error(`${e} failed because the session was destroyed`);if("server"===t.where)throw new Error(s(e,t.value));throw"unreachable"}function s(e,t){let s;return s=Array.isArray(t.reasons)?t.reasons.join():JSON.stringify(t.reasons),`${e} failed, got status ${t.status} ${t.errorCode}, reasons: ${s}`}function n(e){return e<=0?Promise.resolve():new Promise((t=>setTimeout(t,e)))}function r(e,t){return e*(1-t+2*Math.random()*t)}const i=()=>!0;async function a(e,t,{initialDelay:s,maxDelay:o,log:u,shouldRetry:c=i}){return t().catch((async i=>{if(u&&u(`[TalkJS] Retries left: ${e}. Error: ${JSON.stringify(i)}.`),0===e)throw i;if(!await c(i))throw i;const l=1e3*s*1.2,h=r(o?Math.min(1e3*o,l):l,.05);return n(h).then((()=>a(e-1,t,{initialDelay:h/1e3,maxDelay:o,log:u,shouldRetry:c})))}))}function o(){const e={},t=new Promise((function(t,s){e.resolve=t,e.reject=s}));return e.promise=t,e}function u({method:e,url:t,data:s,options:n,attempts:r,shouldRetry:i,authProvider:o}){(!r||r<=0)&&(r=1);const u={"x-talkjs-client-build":"jssdk-dev","x-talkjs-client-date":"2025-03-24T10:07:51.505Z"};s instanceof FormData||(u["Content-Type"]=n?.contentType??"application/json");return a(r,(async()=>{if(o){const e=await o.getToken();u.Authorization=`Bearer ${e}`}return fetch(t,{method:e,headers:u,body:s}).then((e=>{if(e.ok)return e;throw e}))}),{initialDelay:.2,log:void 0,shouldRetry:async s=>o&&401===s.status?(g.log(`401 error from ${e} ${t}, ${await o.getToken()}`),o.refreshToken(),!0):i?i(s):!("status"in s&&s.status>=400&&s.status<500)}).catch((s=>{if(!t.toString().startsWith("https://capture.trackjs.com")){const n=`Network Error for ${e} ${t}`;if("undefined"!=typeof window)if(s instanceof Response){s.clone().text().then((e=>g.log(`${n} ${s.status} ${e}`)))}else g.log(`${n} ${s}`);console.error("[TalkJS]",n)}throw s}))}const{cdnHost:c,appHost:l,restHost:h,realtimeHost:d,appProtocol:p,appWsProtocol:f}=function(){if("undefined"==typeof window)return{cdnHost:"test-hostname",appHost:"test-hostname",appProtocol:"http:",appWsProtocol:"ws:"};const e=function(){if(document.currentScript)return document.currentScript.src;try{throw new Error}catch(e){return e.stack.match(/https?:\/\/.*\.(js|jsx|ts|tsx)/)[0]}}(),t=document.createElement("a");t.href=e;const s=t.host,n=function(e){if(e.match(/^cdn[.-]/))return e.replace(/^cdn/,"app");if("talkjs.com"===e)return"app.talkjs.com";return e}(s),r=function(e){if(e.match(/^app[.-]/))return e.replace(/^app/,"api");return e+"/public_api"}(n),i=function(e){if(e.match(/^app[.-]/))return e.replace(/^app/,"realtime");return e+"/public_api"}(n),a=t.protocol;return{cdnHost:s,appHost:n,restHost:r,realtimeHost:i,appProtocol:a,appWsProtocol:"https:"===a?"wss:":"ws:"}}();const m=l.startsWith("app.talkjs.com");const g="undefined"==typeof window?{log:e=>Promise.resolve(),setData:e=>{}}:new class{constructor(e){this._timeCreated=Date.now(),this._enabled=m,this._trackJSData={customer:{application:"",correlationId:"",sessionId:"",token:"",userId:"",version:"dev-2025-03-24T10:07:51.505Z"},entry:"direct",environment:{age:Date.now()-this._timeCreated,dependencies:{},originalUrl:window.location.href,referrer:document.referrer,userAgent:window.navigator.userAgent},metadata:[],nav:[],network:[],url:window.location.href,stack:"",timestamp:(new Date).toISOString(),version:"dev-2025-03-24T10:07:51.505Z",throttled:0},this._url=`https://capture.trackjs.com/capture?token=${e}`,this._trackJSData.customer.token=e}setData({appId:e,meId:t,sessionId:s}){this._trackJSData.customer.userId=e,this._trackJSData.customer.sessionId=`${e}/${t}`,this._trackJSData.customer.correlationId=s}async log(e){try{if(!this._enabled)return Promise.resolve();const t={...this._trackJSData,message:e};await u({method:"POST",url:this._url,data:JSON.stringify(t),options:{contentType:"text/plain"}})}catch(e){console.error("[TalkJS] Failed when sending an error report. Error: ",e)}}}("970cd0be0fb74630b75c8451051299dc");class v{constructor(e,t){this.states=e,this.transitions=t,this.key=void 0,this._state=e[0]}get state(){return this._state}transition(e,t){const s=this.transitions[e];if(!s){const t=`Realtime State Machine tried to take nonexistent transition ${e.toString()}`;return void g.log(t).catch((()=>{}))}if(!this.canTransition(e,t)){const t=`Realtime State Machine tried to take ${e.toString()} transition while in ${this.state}`;return void g.log(t).catch((()=>{}))}const n=this.state,r=this.key;this._state=s.to,"LOCK"===s.keyRequired?this.key=t:"UNLOCK"===s.keyRequired&&(this.key=void 0),function(){const e={stack:(new Error).stack||"no stack trace available"}}(this.states),s.onTransition({from:n,to:this.state,fromKey:r,toKey:this.key})}canTransition(e,t){const s=this.transitions[e];if(!s)return!1;const{from:n,keyRequired:r}=s;return!(void 0!==r&&!t)&&(("UNLOCK"!==r||void 0===this.key||t===this.key)&&("ANY"===n||n.includes(this.state)))}}function b(e){return{ok:!0,value:e}}function A(e){return{ok:!1,where:"client",value:e}}function w(e){return{ok:!1,where:"server",value:e}}function y(){const e={},t=new Promise((t=>{e.ok=async e=>t(b(e)),e.clientErr=e=>t(A(e)),e.serverErr=e=>t(w(e)),e.resolve=e=>t(e)}));return e.promise=t,e}let C=null;function E({WebSocket:e}){C=e}class k{constructor(e,t,s,n){this.realtimeUrl=e,this.appId=t,this.userId=s,this.handlers=n,this.socket=null,this.throttler=new x,this.stateMachine=new v(["WAITING_TO_CONNECT","CONNECTING","READY","TERMINATED"],{connect:{from:["WAITING_TO_CONNECT"],to:"CONNECTING",onTransition:()=>this.createWebSocket()},ready:{from:["CONNECTING"],to:"READY",onTransition:()=>{this.throttler.resetDelay(),this.handlers.onReady()}},reconnect:{from:["READY","CONNECTING"],to:"WAITING_TO_CONNECT",onTransition:({from:e})=>{"READY"===e&&this.handlers.onNotReady(),this.throttler.request((()=>{this.stateMachine.transition("connect")}))}},destroy:{from:"ANY",to:"TERMINATED",onTransition:()=>{this.socket?.close(1e3)}}}),this.stateMachine.transition("connect")}createWebSocket(){const e=new(function(){if(C)return C;if(globalThis.WebSocket)return globalThis.WebSocket;throw new Error("Missing WebSocket implementation")}())(this.realtimeUrl);this.socket=e;const t=()=>this.stateMachine.transition("ready");e.addEventListener("open",t),e.addEventListener("message",this.handlers.onMessage);const s=()=>{e.removeEventListener("open",t),e.removeEventListener("close",s),e.removeEventListener("message",this.handlers.onMessage),"TERMINATED"!==this.stateMachine.state&&this.stateMachine.transition("reconnect")};e.addEventListener("close",s)}send(e){return"READY"===this.stateMachine.state?(this.socket.send(e),b(void 0)):A("SOCKET_NOT_READY")}terminate(){if(this.socket)if("terminate"in this.socket)this.socket.terminate();else if("dispatchEvent"in this.socket){this.socket.close(1e3);const e=new Event("close"),t=Object.assign(e,{code:1e3,reason:"",wasClean:!0});this.socket.dispatchEvent(t)}else this.socket.close(1e3)}destroy(){this.stateMachine.transition("destroy")}}let x=class{constructor(){this.initialDelayMs=200+200*Math.random(),this.exponentialFactor=1.2,this.maxDelayMs=1e4,this.currentDelayMs=this.initialDelayMs}request(e){const t=r(this.currentDelayMs,.05);n(this.currentDelayMs).then((()=>e())),this.currentDelayMs=Math.min(t*this.exponentialFactor,this.maxDelayMs)}resetDelay(){this.currentDelayMs=this.initialDelayMs}};class S{constructor(e,t,s,n){this.handlers=n,this.socket=new k(e,t,s,{onReady:()=>this.handlers.onReady(),onNotReady:()=>this.handlers.onNotReady(),onMessage:e=>this.onWebSocketMessage(e)})}call(e,t,s,n){const r=`/${s.map((e=>encodeURIComponent(e))).join("/")}`,i=JSON.stringify([e,t,r,n]);return this.socket.send(i)}destroy(){this.socket.destroy()}terminate(){this.socket.terminate()}onWebSocketMessage(e){if("Auth token expired"!==e.data)try{const t=JSON.parse(e.data);if("PUBLISH"===t[1]){const e=t[0],s=JSON.stringify([e,"ACK"]);this.socket.send(s);const n=t.slice(2),r=[];n.forEach((e=>{"session.expired"===e.type?this.handlers.onAuthExpired():"upstream.restarting"===e.type?this.handlers.onUpstreamRestarting():r.push(e)})),r.length>0&&this.handlers.onPublish(e,r)}else{const e=t[0],s=t[1],n=t[2];this.handlers.onResponse(e,s,n)}}catch(e){}else this.handlers.onAuthExpired()}}class T{constructor(){this.i=-1}next(){return this.i++,this.i}reset(){this.i=-1}}class I{constructor(e,t,s,n){this.handlers=n,this.seqCounter=new T,this.responseHandlers={},this.heartbeats=new F(this),this.socket=new S(e,t,s,{onUpstreamRestarting:()=>{this.heartbeats.serverActive(),this.handlers.onUpstreamRestarting()},onReady:()=>{this.heartbeats.clientActive(),this.heartbeats.serverActive(),this.handlers.onReady()},onNotReady:()=>{this.heartbeats.stop(),Object.values(this.responseHandlers).forEach((e=>{e.clientErr("WEBSOCKET_DISCONNECTED")})),this.responseHandlers={},this.seqCounter.reset(),this.handlers.onNotReady()},onResponse:(e,t,s)=>{this.heartbeats.serverActive(),this.onResponse(e,t,s)},onPublish:(e,t)=>{this.heartbeats.serverActive(),this.handlers.onPublish(e,t),this.heartbeats.clientActive()},onAuthExpired:()=>{this.heartbeats.serverActive(),this.handlers.onAuthExpired()}})}call(e,t,s){const n=this.seqCounter.next(),r=y();this.responseHandlers[n]=r;const i=this.socket.call(n,e,t,s);return i.ok||r.resolve(i),this.heartbeats.clientActive(),r.promise}async onResponse(e,t,s){const n=this.responseHandlers[e];n&&(200===t?n.ok({status:t,data:s}):n.serverErr({status:t,errorCode:s.errorCode,reasons:s.reasons}),delete this.responseHandlers[e])}destroy(){this.heartbeats.stop(),Object.values(this.responseHandlers).forEach((e=>{e.clientErr("WEBSOCKET_DISCONNECTED")})),this.responseHandlers={},this.socket.destroy()}terminate(){this.socket.terminate()}}class D{constructor(e){this.intervalMs=e,this.timeout=void 0}schedule(e){this.stop(),this.timeout=setTimeout((()=>{void 0!==this.timeout&&(this.stop(),e())}),this.intervalMs)}stop(){void 0!==this.timeout&&(clearTimeout(this.timeout),this.timeout=void 0)}}class F{constructor(e){this.connection=e,this.clientInactivityTimer=new D(25e3),this.serverInactivityTimer=new D(1e4),this.serverTimeoutTimer=new D(5e3)}clientActive(){this.clientInactivityTimer.schedule((()=>{this.sendHeartbeat()}))}serverActive(){this.serverTimeoutTimer.stop(),this.serverInactivityTimer.schedule((()=>{this.sendHeartbeat(),this.serverTimeoutTimer.schedule((()=>{this.connection.terminate()}))}))}stop(){this.clientInactivityTimer.stop(),this.serverInactivityTimer.stop(),this.serverTimeoutTimer.stop()}sendHeartbeat(){this.connection.call("GET",["ping"],{}).catch((()=>{}))}}class O{constructor(e,t,s,n,r){this.authProvider=n,this.handlers=r,this.stateMachine=new v(["WAITING_FOR_CUPID","WAITING_FOR_TOKEN","WAITING_FOR_SESSION","READY","TERMINATED"],{getAuthToken:{from:["WAITING_FOR_CUPID"],to:"WAITING_FOR_TOKEN",onTransition:async()=>{const e=await this.authProvider.getToken();"WAITING_FOR_TOKEN"===this.stateMachine.state&&this.stateMachine.transition("sendAuthToken",e)}},sendAuthToken:{from:["WAITING_FOR_TOKEN","WAITING_FOR_SESSION","READY"],to:"WAITING_FOR_SESSION",keyRequired:"LOCK",onTransition:({from:e,fromKey:t,toKey:s})=>{"WAITING_FOR_SESSION"===e&&t===s||(this.renewSession(s),this.lastSentAuthToken=s)}},ready:{from:["WAITING_FOR_SESSION"],to:"READY",keyRequired:"UNLOCK",onTransition:()=>{this.handlers.onReady()}},refreshAuthToken:{from:["WAITING_FOR_SESSION","READY"],to:"WAITING_FOR_TOKEN",onTransition:()=>{this.authProvider.refreshToken()}},notReady:{from:["WAITING_FOR_TOKEN","WAITING_FOR_SESSION","READY"],to:"WAITING_FOR_CUPID",onTransition:({from:e})=>{"READY"===e&&this.handlers.onDisconnected()}},destroy:{from:"ANY",to:"TERMINATED",onTransition:()=>{this.connection.destroy()}}}),this.connection=new I(e,t,s,{onUpstreamRestarting:()=>this.handlers.onUpstreamRestarting(),onReady:()=>this.stateMachine.transition("getAuthToken"),onNotReady:()=>this.stateMachine.transition("notReady"),onAuthExpired:()=>{"READY"===this.stateMachine.state&&(this.stateMachine.transition("refreshAuthToken"),this.handlers.onAuthExpired())},onPublish:(e,t)=>{this.handlers.onPublish(e,t)}}),n.onTokenChanged((e=>{this.stateMachine.canTransition("sendAuthToken",e)&&this.stateMachine.transition("sendAuthToken",e)}))}call(e,t,s){const n=this.connection.call(e,t,s);return n.then((e=>{e.ok||"server"!==e.where||401!==e.value.status||"WAITING_FOR_TOKEN"===this.stateMachine.state||"WAITING_FOR_SESSION"===this.stateMachine.state||this.stateMachine.transition("refreshAuthToken")})),n}destroy(){this.stateMachine.transition("destroy")}async renewSession(e){const t=await this.connection.call("POST",["session","renew"],{token:e});if(!t.ok&&"client"===t.where)return;const n=t.value;if(n.status,200===n.status){const t=n.data.expiresInSeconds;return void(null!==t&&t<120?(console.error(`[TalkJS] Authenticated with a token that expires in ${t}s. Treating it as already expired and refreshing. Newly generated tokens should last at least 10 minutes.`),this.stateMachine.transition("refreshAuthToken")):(this.authProvider.scheduleRefresh(t),this.authProvider.emitTokenAccepted(e),this.lastAcceptedAuthToken=e,this.stateMachine.canTransition("ready",e)&&this.stateMachine.transition("ready",e)))}if(401===n.status)return void this.stateMachine.transition("refreshAuthToken");if(400===n.status)return void this.authProvider.emitTokenRefreshFailed(s("Authentication",n));if(402===n.status)return void this.authProvider.emitTokenRefreshFailed(s("Authentication",n));const r=5e3*Math.random()+5e3;setTimeout((()=>{this.call("POST",["session","renew"],{token:e}).catch((()=>{}))}),r)}}class M{constructor(e,t,s,n,r){this.handlers=r,this.stateMachine=new v(["WAITING_FOR_AUTH","PROCESSING_QUEUE","READY","TERMINATED"],{processQueue:{from:["WAITING_FOR_AUTH"],to:"PROCESSING_QUEUE",onTransition:()=>{this.sendQueuedCalls()}},ready:{from:["PROCESSING_QUEUE"],to:"READY",onTransition:()=>{this.handlers.onReady()}},notReady:{from:["PROCESSING_QUEUE","READY"],to:"WAITING_FOR_AUTH",onTransition:()=>{Object.values(this.subscribeQueue).forEach((e=>e.deferred.ok({status:200,data:{}}))),this.subscribeQueue={},this.handlers.onSubscriptionsLost()}},destroy:{from:"ANY",to:"TERMINATED",onTransition:()=>{for(;this.callQueue.length;){const e=this.callQueue.shift()?.deferred;e?.clientErr("SESSION_DESTROYED")}this.connection.destroy()}}}),this.subscribeQueue={},this.callQueue=[],this.connection=new O(e,t,s,n,{onUpstreamRestarting:()=>{this.handlers.onUpstreamRestarting()},onReady:()=>{this.stateMachine.transition("processQueue")},onAuthExpired:()=>{this.stateMachine.transition("notReady")},onDisconnected:()=>{this.stateMachine.transition("notReady")},onPublish:(e,t)=>{this.handlers.onPublish(e,t)}})}call(e,t,s){return"READY"===this.stateMachine.state?this.connection.call(e,t,s):"SUBSCRIBE"===e||"UNSUBSCRIBE"===e?this._subscribe(e,t,s):this._call(e,t,s)}_subscribe(e,t,s){const n=t.join("/"),r=this.subscribeQueue[n];if(r&&r.method===e)return r.deferred.promise;r&&r.method!==e&&(r.deferred.ok({status:200,data:{}}),delete this.subscribeQueue[n]);const i={deferred:y(),method:e,path:t,data:s};return this.subscribeQueue[n]=i,i.deferred.promise}_call(e,t,s){const n={deferred:y(),method:e,path:t,data:s};return this.callQueue.push(n),n.deferred.promise}dequeue(){for(const e in this.subscribeQueue){const t=this.subscribeQueue[e];return delete this.subscribeQueue[e],t}return this.callQueue.shift()}destroy(){this.stateMachine.transition("destroy")}async sendQueuedCalls(){for(;"PROCESSING_QUEUE"===this.stateMachine.state;){const e=this.dequeue();if(!e)return void this.stateMachine.transition("ready");this.connection.call(e.method,e.path,e.data).then((t=>{e.deferred.resolve(t)})),await new Promise((e=>setTimeout(e,100)))}}isConnected(){return"READY"===this.stateMachine.state}}const B="undefined"!=typeof window?window.queueMicrotask??setTimeout:setTimeout;class _{constructor(e,t){this.clearPendingBatch=e,this.sendCalls=t,this.sent=!1,B((()=>this.send()))}send(){this.sent||(this.sent=!0,this.clearPendingBatch(),this.sendCalls())}destroy(){this.sent=!0}}class R extends _{constructor(e,t){super(t,(()=>{this.sendSubscribe(),this.sendGet()})),this.connection=e,this.getCalls=[],this.subscribeCalls=[]}canPush(e,t){return R.isCorrectBatchTypeFor(e,t)}static isCorrectBatchTypeFor(t,s){return e(s,["users","*"])&&("GET"===t||"SUBSCRIBE"===t)}push(e,t,s){const n=t[1],r=y();return"GET"===e?this.getCalls.push({userId:n,deferred:r}):this.subscribeCalls.push({userId:n,deferred:r}),1e3!==this.getCalls.length&&1e3!==this.subscribeCalls.length||this.send(),r.promise}async sendGet(){if(0===this.getCalls.length)return;const e=[...new Set(this.getCalls.map((e=>e.userId)))],t=await this.connection.call("GET",["users"],{ids:e,includePrivateFields:!1});if(t.ok)for(const e of this.getCalls){const s=t.value.data[e.userId];s?e.deferred.ok({status:200,data:s}):e.deferred.serverErr({status:404,errorCode:"NOT_FOUND",reasons:["No user with that ID exists"]})}else this.getCalls.forEach((e=>e.deferred.resolve(t)))}sendSubscribe(){if(0===this.subscribeCalls.length)return;const e=[...new Set(this.subscribeCalls.map((e=>e.userId)))];this.connection.call("SUBSCRIBE",["users"],{ids:e}).then((e=>this.subscribeCalls.forEach((t=>t.deferred.resolve(e)))))}}class N extends _{constructor(e,t,s){super(s,(()=>this.sendMutate())),this.conversationId=e,this.connection=t,this.calls=[]}canPush(e,t){return!!N.isCorrectBatchTypeFor(e,t)&&t[1]===this.conversationId}static isCorrectBatchTypeFor(t,s){return e(s,["conversations","*","participants","*"])&&("PUT"===t||"POST"===t||"PATCH"===t)}push(e,t,s){const n=t[3],r=y();return this.calls.push({action:{id:n,method:e,params:s},deferred:r}),100===this.calls.length&&this.send(),r.promise}async sendMutate(){const e=this.calls.map((e=>e.action)),t=await this.connection.call("POST",["conversations",this.conversationId,"participants"],{actions:e});if(!t.ok)return void this.calls.forEach((e=>e.deferred.resolve(t)));const s=t.value.data.responses;for(let e=0;e<s.length;e++){const t=this.calls[e].deferred,n=s[e];200===n.status?t.ok({...n,data:{}}):t.serverErr(n)}}}class P{constructor(e,t,s,n,r){this.pendingBatch=null,this.connection=new M(e,t,s,n,r)}async call(e,t,s){if(this.pendingBatch?.canPush(e,t))return this.pendingBatch.push(e,t,s);this.pendingBatch&&this.pendingBatch.send();const n=this.createEmptyBatchFor(e,t);return n?(this.pendingBatch=n,n.push(e,t,s)):this.connection.call(e,t,s)}destroy(){this.connection.destroy(),this.pendingBatch?.destroy()}isConnected(){return this.connection.isConnected()}createEmptyBatchFor(e,t){if(R.isCorrectBatchTypeFor(e,t))return new R(this.connection,(()=>this.pendingBatch=null));if(N.isCorrectBatchTypeFor(e,t)){const e=t[1];return new N(e,this.connection,(()=>this.pendingBatch=null))}return null}}const U={200:"RESOLVE",400:"RESOLVE",401:"RETRY",402:"RESOLVE",403:"RESOLVE",404:"RESOLVE",405:"RESOLVE",409:"RESOLVE",429:"DELAY",500:"DELAY"};class j{constructor(e,t,s,n,r){this.throttler=new $,this.alive=!0,this.connection=new P(e,t,s,n,r)}async call(e,t,s){let n=0;for(;this.alive;){const r=await this.connection.call(e,t,s);if((r.ok||"client"!==r.where||"SOCKET_NOT_READY"!==r.value)&&(r.ok||"server"!==r.where||500!==r.value.status)||n++,10===n)return r;if(r.ok||"client"!==r.where){const e=r.value,t=e.status,s=U[t];if("RESOLVE"===s)return this.throttler.resetDelay(),r;if("RETRY"===s)continue;if("DELAY"===s){await this.throttler.wait();continue}return console.warn("[TalkJS] Unexpected status code",t),e}if("SESSION_DESTROYED"===r.value)return A("SESSION_DESTROYED");"WEBSOCKET_DISCONNECTED"!==r.value&&("SOCKET_NOT_READY"!==r.value?r.value:await this.throttler.wait())}return A("SESSION_DESTROYED")}destroy(){this.alive=!1,this.connection.destroy()}isConnected(){return this.connection.isConnected()}}class ${constructor(){this.initialDelayMs=200,this.exponentialFactor=1.2,this.maxDelayMs=3e4,this.currentDelayMs=this.initialDelayMs,this.lastCall=0}getCurrentDelay(){return this.currentDelayMs}wait(){const e=(new Date).getTime(),t=r(this.currentDelayMs,.05),s=this.lastCall+t,i=Math.max(0,s-e);return this.lastCall=e+i,this.currentDelayMs=Math.min(t*this.exponentialFactor,this.maxDelayMs),n(i)}resetDelay(){this.currentDelayMs=this.initialDelayMs}}class L{constructor(e,t,s,n,r){this.handlers=r,this.targetSubscriptions=new Set,this.connection=new j(e,t,s,n,{onUpstreamRestarting:()=>this.handlers.onUpstreamRestarting(),onSubscriptionsLost:()=>{for(const e of this.targetSubscriptions)this.resubscribe(e);this.handlers.onResubscribeSent()},onReady:()=>this.handlers.onReady(),onPublish:(e,t)=>{this.handlers.onPublish(e,t)}})}call(e,t,s){return this.connection.call(e,t,s)}async subscribe(e){return this.targetSubscriptions.add(e),this.connection.call("SUBSCRIBE",e,{})}async unsubscribe(e){return this.targetSubscriptions.delete(e),this.connection.call("UNSUBSCRIBE",e,{})}async resubscribe(e){const t=await this.connection.call("SUBSCRIBE",e,{});t.ok||this.handlers.onResubscribeError(e,t)}destroy(){this.targetSubscriptions=new Set,this.connection.destroy()}isConnected(){return this.connection.isConnected()}}function W(e,t){return void 0===t?e:t}function q(e,t){if(void 0===t)return e;if(null===t)return{};const s={...e};for(const e in t){const n=t[e];null===n?delete s[e]:s[e]=n}return s}function G(e,t){if(e===t)return!0;if(!e||!t)return!1;if("object"!=typeof e||"object"!=typeof t)return!1;if(e.constructor!==t.constructor)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let s=0;s<e.length;s++)if(!G(e[s],t[s]))return!1}else{const s=Object.keys(e);if(s.length!==Object.keys(t).length)return!1;for(const n of s){if(!Object.hasOwnProperty.call(t,n))return!1;if(!G(e[n],t[n]))return!1}}return!0}class H{constructor(){this.prev=Promise.resolve()}async runExclusive(e){const t=this.prev.then((()=>e()));return this.prev=t,t}}class z{constructor(e,t){this.onTeardown=t,this.error=null,this.lastLoadedState=void 0,this.lastGoodState=Promise.resolve(void 0),this.initialised=!1,this.getDeepMutex=new H,this.lastDeep=void 0;const s=new Promise((e=>setTimeout(e))).then((async()=>{const t=await this.fetchInitial(e);return this.initialised=!0,t})),n={seq:e,resultPromise:s};this.lastState=n,this.states=[n],this.lastLoadedState=void 0}set lastState(e){const t=this.lastGoodState;this.lastGoodState=e.resultPromise.then((e=>e.ok?e.value:t)),e.resultPromise.then((e=>{e.ok||this.setError(e)})),this._lastState=e}get lastState(){return this._lastState}async refetchInitial(e){const t=this.lastGoodState,s=this.fetchInitial(e),[n,r]=await Promise.all([t,s]);if(void 0===n)return r;if(!r.ok)return r;return this.equal(n,r.value)?b(n):r}refetch(e){if(this.error)return;const t={seq:e,resultPromise:this.refetchInitial(e)};this.lastState=t,this.states.push(t)}mutate(e,t){if(this.error)return void console.warn("[TalkJS] Attempting to mutate a terminated store");if(!this.initialised&&e>this._lastState.seq)return;if(e<this.lastState.seq)throw"Seq is in the past";const s={seq:e,resultPromise:this.lastState.resultPromise.then((e=>e.ok?t(e):e))};this.lastState=s,this.states.push(s)}async getDeep(e){return this.getDeepMutex.runExclusive((async()=>{if(this.error)return this.error;if(this.lastLoadedState&&e<this.lastLoadedState.seq)throw`Trying to load state ${e} when we have previously loaded ${this.lastLoadedState.seq}`;let t;for(;this.states.length&&this.states[0].seq<=e;)t=this.states.shift();t&&(this.lastLoadedState=t);const s=this.lastLoadedState;if(void 0===s)throw`[TalkJS] Tried to load state ${e} which is before the store was created`;const n=await s.resultPromise;if(!n.ok)return n;const r=await this.loadNested(e,n.value);return r.ok&&this.lastDeep&&r.value.lastChanged===this.lastDeep.value.lastChanged?this.lastDeep:(r.ok?this.lastDeep=r:this.setError(r),r)}))}setError(e){this.error||(this.error=e,this.onTeardown?.(e),this.lastGoodState.then((e=>{void 0!==e&&this.teardownNested(e)})))}}class J extends z{constructor(e,t,s){super(e,s),this.emitMutex=t,this.unsubscribeTimer=new V,this.referencedByOtherStores=0,this.listeners=[],this.lastEmitSeq=void 0,this.lastEmitResult=void 0,t.runExclusive((async()=>{await this.emit(e)}))}registerInternalSubscription(){this.referencedByOtherStores++;let e=!0;return()=>{e&&(e=!1,this.referencedByOtherStores--,this.startUnsubscribeTimerIfOrphan())}}get onlyUsedInternally(){return 0===this.listeners.length}listen(e){return this.unsubscribeTimer.stop(),this.listeners.push(e),void 0!==this.lastEmitResult&&e(this.lastEmitResult),()=>{this.listeners=this.listeners.filter((t=>t!==e)),this.startUnsubscribeTimerIfOrphan()}}startUnsubscribeTimerIfOrphan(){0===this.referencedByOtherStores&&0===this.listeners.length&&this.unsubscribeTimer.restart((()=>{this.setError(A("UNSUBSCRIBED"))}),this.unsubscribeDebounceMs)}async emit(e){if(this.lastEmitSeq&&this.lastEmitSeq>=e)return;if(!1===this.lastEmitResult?.ok)return;const t=this.lastEmitSeq;this.lastEmitSeq=e;const s=await this.getDeep(e);this.lastEmitResult,this.lastEmitResult=s,s.ok?(void 0===t||t<s.value.lastChanged)&&this.listeners.forEach((e=>e(s))):this.listeners.forEach((e=>e(s)))}}class V{constructor(){this.timerId=void 0}restart(e,t){void 0!==this.timerId&&clearTimeout(this.timerId),this.timerId=setTimeout((()=>e()),t)}stop(){clearTimeout(this.timerId)}}class Y extends J{constructor(e,t,s,n,r){super(e,n,r),this.userId=t,this.realtimeClient=s,this.unsubscribeDebounceMs=6e4}async fetchInitial(e){const t=await this.realtimeClient.call("GET",["users",this.userId],{includePrivateFields:!1},{bypassCache:!0});return t.ok?b({snapshot:this.realtimeClient.createUserSnapshot(t.value.data),lastChanged:e}):"server"===t.where&&404===t.value.status?b({snapshot:null,lastChanged:e}):t}equal(e,t){return G(e.snapshot,t.snapshot)}async loadNested(e,t){return b(t)}userCreated(e,t){this.mutate(e,(()=>b({snapshot:this.realtimeClient.createUserSnapshot(t.state),lastChanged:e})))}userEdited(e,t){this.mutate(e,(s=>{const n=s.value.snapshot;if(null===n)return console.warn("[TalkJS] Received a 'used edited' event for a user that we thought didn't exist."),s;return b({snapshot:{id:n.id,name:W(n.name,t.diff.name),custom:q(n.custom,t.diff.custom),locale:W(n.locale,t.diff.locale),photoUrl:W(n.photoUrl,t.diff.photoUrl),role:W(n.role,t.diff.role),welcomeMessage:W(n.welcomeMessage,t.diff.welcomeMessage)},lastChanged:e})}))}async getFromCache(){const e=await this.lastState.resultPromise;return e.ok?null===e.value.snapshot?w({status:404,errorCode:"USER_NOT_FOUND",reasons:["That user does not exist yet"]}):b({status:200,data:{id:e.value.snapshot.id,name:e.value.snapshot.name,custom:e.value.snapshot.custom,locale:e.value.snapshot.locale,photoUrl:e.value.snapshot.photoUrl,role:e.value.snapshot.role,welcomeMessage:e.value.snapshot.welcomeMessage}}):A("NOT_IN_CACHE")}teardownNested(e){}}const K=/\uFE0F/g,Q=String.fromCharCode(8205);function Z(e){if(":arslan:"===e.text)return":arslan:";const t=function({text:e,kind:t}){return"unicode"===t?function(e){const t=[];let s=0,n=0,r=0;for(;r<e.length;)s=e.charCodeAt(r++),n?(t.push((65536+(n-55296<<10)+(s-56320)).toString(16)),n=0):55296<=s&&s<=56319?n=s:t.push(s.toString(16));return t.join("-")}((s=e).indexOf(Q)<0?s.replace(K,""):s):ee[e]??function(e){if(/;-?\)/.test(e))return"1f609";if(e=e.replace(/;/g,":"),/:-o/i.test(e))return"1f631";return e=e.replace(/-/g,"").toLowerCase(),X[e]}(e);var s}(e);return t?String.fromCodePoint(parseInt(t,16)):e.text}const X={":)":"1f642",":o":"1f62e",":]":"1f60f",":d":"1f600",xd:"1f61d",":p":"1f61c",":@":"1f621",":[":"1f621",":(":"1f626",":'(":"1f62d",":’(":"1f62d",":*":"1f618",":/":"1f614",":s":"1f616",":|":"1f633",":$":"263a",":x":"1f637","<3":"2764","</3":"1f494"},ee={":thumbsup:":"1f44d",":thumbsdown:":"1f44e",":poop:":"1f4a9"};var te,se={};function ne(e,t){const s=t.lastIndex;let n;const r=[];for(;null!==(n=t.exec(e));)r.push(n);return t.lastIndex=s,r}function re(e){const t=e.replace(/%2F/g,"/").replace(/^.*?\/([^/]+?)(?:\?.*)?$/,"$1");return decodeURIComponent(t)}function ie(e,t){if(!e()&&!t){t=e.toString().replace(/^function\s*\(\)\s*\{\s*return\s*(.*);\s*\}\s*$/,"`$1`")+" was not true"}}!function(){if(te)return se;function e(e){return String.fromCharCode(parseInt(e.slice(1),16))}function t(e){return`%${`00${e.charCodeAt(0).toString(16)}`.slice(-2)}`}te=1,Object.defineProperty(se,"__esModule",{value:!0}),se.encode=function(t){return btoa(encodeURIComponent(t).replace(/%[0-9A-F]{2}/g,e))},se.decode=function(e){return decodeURIComponent(Array.from(atob(e),t).join(""))}}(),(e=>{function t(e){}function s(e,t){(function(e,t){switch(t){case"undefined":return void 0===e;case String:return"string"==typeof e||e instanceof String;case Boolean:return"boolean"==typeof e||e instanceof Boolean;case Number:return"number"==typeof e||e instanceof Number;default:return e instanceof t}})(e,t)||(t.name,String(e))}e.defined=t,e.has=function(e,t){e[t]},e.is=s,e.equals=function(e,t){},e.oneOf=function(e,t){t.includes(e)||JSON.stringify(t)},e.isArray=function(e,t){s(e,Array),e&&e.length>0&&s(e[0],t)},e.optional=function(e,t){void 0!==e&&s(e,t)},e.falsy=function(e){},e.never=function(){}})(ie||(ie={}));const ae=ie,oe=/^\/.*[^\\]\/[im]*$/;function ue(e){if(!oe.test(e))return!1;return!ce(e).test("")}function ce(e){const t=e.match(/^\/(.*[^\\])\/(.*)$/);if(!t)throw new Error(`Expected ${e} to be a (non-empty) regex`);let s=t[2]||"";return s=s.replace(/[^im]/g,"")+"g",new RegExp(t[1],s)}class le{constructor({mode:e,allowedHostnames:t,allowedPhoneNrs:s,allowedMatches:n,forbiddenMatches:r,suppressLinks:i,suppressEmailAddresses:a,suppressPhoneNumbers:o,replacement:u}){ae.oneOf(e,["all","otherOnly","off"]),this.mode=e,this.suppressLinks=!1!==i,this.suppressEmailAddresses=!1!==a,this.suppressPhoneNumbers=!1!==o,this.allowedHostnames=t||[],this.allowedPhoneNrs=(s||[]).filter((e=>e)).map((e=>e.replace(/[^0-9]/g,""))),this.allowedMatches=(n||[]).filter(ue).map((e=>ce(e))),this.forbiddenMatches=(r||[]).filter(ue).map((e=>ce(e))),ae((()=>this.allowedMatches.every((e=>e.flags.includes("g")))),"All regexes in `suppressContactInfo.allowedMatches` must be global. Check `allowedMatches`!"),ae((()=>this.forbiddenMatches.every((e=>e.flags.includes("g")))),"All regexes in `suppressContactInfo.forbiddenMatches` must be global. Check `forbiddenMatches`!"),u=u?.trim(),this.replacement=u&&u.length>0?u:void 0}shouldSuppress({isContentBySender:e}){return"all"===this.mode||"otherOnly"===this.mode&&!e}}function he(e,t){const s=e.map((e=>function(e,t){if("text"===e.type)return function(e,t){if(t.contactInfo&&!t.t)throw new Error("When contactInfo is given and not false, t is required as well.");const s=function(e){let t="";return e.t&&(t=`(${e.t("CONTACT_INFORMATION_HIDDEN")})`),{formattedLinks:e.formattedLinks??"plaintext",markup:e.markup??!1,useFallbackMentions:e.useFallbackMentions??!1,sameTabLinkRules:e.sameTabLinkRules??[],emojis:e.emojis??!1,highlight:e.highlight??[],contactInfo:e.contactInfo??!1,suppression:e.suppression??new le({mode:"off"}),contactInfoHiddenText:e.contactInfoHiddenText??e.suppression?.replacement??t,customEmojiUrls:e.customEmojiUrls??{}}}(t);return de(e,s)}(e.children,t);if("file"===e.type&&"video"===e.subtype)return`🎥 ${re(e.url)}`;if("file"===e.type&&"image"===e.subtype)return`📷 ${re(e.url)}`;if("file"===e.type&&"audio"===e.subtype)return`🎧 ${re(e.url)}`;if("file"===e.type&&"voice"===e.subtype){return`🎙️ ${t.t?.("VOICE_MESSAGE")??"Voice message"}`}if("file"===e.type)return e.subtype,`📎 ${re(e.url)}`;if("location"===e.type){return`📍 ${t.t?.("LOCATION")??"Location"}`}return""}(e,t)));return s.join("\n\n")}function de(e,t){return e.flatMap((e=>{if("string"==typeof e)return e;switch(e.type){case"blockquote":case"bold":case"italic":case"strikethrough":case"link":case"actionlink":case"actionLink":case"actionbutton":case"actionButton":return de(e.children,t);case"bulletlist":case"bulletList":return"\n"+de(e.children,t);case"bulletpoint":case"bulletPoint":return"- "+de(e.children,t)+"\n";case"autolink":case"autoLink":case"codeblock":case"codeBlock":case"codespan":case"codeSpan":case"customemoji":case"customEmoji":return e.text;case"suppressed":return t.contactInfoHiddenText;case"mention":return`@${e.text}`;case"emoji":return"images"===t.emojis?"":"unicode"===t.emojis?Z(e):e.text}})).join("")}class pe extends z{constructor(e,t,s,n){super(e),this.conversationId=t,this.message=s,this.realtimeClient=n}get messageId(){return"string"==typeof this.message?this.message:this.message.id}async fetchInitial(e){let t;if("object"==typeof this.message)t=this.message;else{const e=await this.realtimeClient.call("GET",["me","conversations",this.conversationId,"messages",this.message],{},{bypassCache:!0});if(!e.ok)return e;t=e.value.data}return b({lastChanged:e,sender:null===t.senderId?null:this.realtimeClient.internalSubscribe(["users",t.senderId]),data:{id:t.id,type:t.type,custom:t.custom,createdAt:t.createdAt,editedAt:t.editedAt,referencedMessageId:t.referencedMessageId,origin:t.origin,plaintext:he(t.content,this.realtimeClient.renderOptions),content:t.content}})}refetch(e){throw"Do not call refetch on message data stores, it can return outdated data. Destroy and remake them instead"}equal(e,t){return G(e.data,t.data)}teardownNested(e){e.sender?.unsubscribe()}async loadNested(e,t){const s=await(t.sender?.store?.getDeep(e));if(!1===s?.ok)return s;if(null===t.data)return b({lastChanged:t.lastChanged,snapshot:null});const n=s?.value;return b({lastChanged:Math.max(t.lastChanged,n?.lastChanged??0),snapshot:{sender:n?.snapshot??null,id:t.data.id,type:t.data.type,custom:t.data.custom,createdAt:t.data.createdAt,editedAt:t.data.editedAt,origin:t.data.origin,plaintext:he(t.data.content,this.realtimeClient.renderOptions),content:t.data.content,referencedMessageId:t.data.referencedMessageId}})}messageEdited(e,t){this.mutate(e,(s=>{if(null===s.value.data)return s;return b({lastChanged:e,sender:s.value.sender,data:{id:s.value.data.id,type:s.value.data.type,createdAt:s.value.data.createdAt,origin:s.value.data.origin,referencedMessageId:s.value.data.referencedMessageId,editedAt:W(s.value.data.editedAt,t.diff.editedAt),custom:q(s.value.data.custom,t.diff.custom),content:W(s.value.data.content,t.diff.content)}})}))}messageDeleted(e,t){this.mutate(e,(s=>null===s.value.data?s:this.messageId===t.messageId?b({lastChanged:e,sender:null,data:null}):s.value.data.referencedMessageId===t.messageId?b({lastChanged:e,sender:s.value.sender,data:{id:s.value.data.id,type:s.value.data.type,createdAt:s.value.data.createdAt,origin:s.value.data.origin,referencedMessageId:null,editedAt:s.value.data.editedAt,custom:s.value.data.custom,content:s.value.data.content}}):s))}async getFromCache(){const e=await this.lastState.resultPromise;if(!e.ok)return A("NOT_IN_CACHE");if(null===e.value.data){return w({status:404,errorCode:"MESSAGE_NOT_FOUND",reasons:["No message with that ID exists"]})}const{sender:t,...s}=e.value;return b({status:200,data:{...s.data,senderId:t?.store.userId??null}})}}class fe extends z{constructor(e,t,s,n){super(e),this.createdAt=t,this.dataStore=s,this.referencedDataStore=n}get messageId(){return this.dataStore.messageId}async fetchInitial(e){return b({lastChanged:e,dataStore:this.dataStore,referencedDataStore:this.referencedDataStore})}refetch(e){throw"Do not call refetch on message stores, it can return outdated data. Destroy and remake them instead"}equal(e,t){return!0}teardownNested(e){}async loadNested(e,t){const s=await t.dataStore.getDeep(e);if(!s.ok)return s;const n=s.value;if(null===n.snapshot)return b({lastChanged:s.value.lastChanged,snapshot:null});const r=await(t.referencedDataStore?.getDeep(e));if(r&&!r.ok)return r;const i=r?.value??null,a=i?.snapshot??null;return b({lastChanged:Math.max(n.lastChanged,i?.lastChanged??0),snapshot:{id:n.snapshot.id,type:n.snapshot.type,sender:n.snapshot.sender,custom:n.snapshot.custom,createdAt:n.snapshot.createdAt,editedAt:n.snapshot.editedAt,referencedMessage:a,origin:n.snapshot.origin,plaintext:n.snapshot.plaintext,content:n.snapshot.content}})}}class me extends J{constructor(e,t,s,n,r){super(e,t,r),this.conversationId=s,this.realtimeClient=n,this.unsubscribeDebounceMs=1e3,this.pendingLoadMore=void 0}listen(e){return this.onlyUsedInternally&&this.lastState.resultPromise.then((e=>{if(e.ok&&null!==e.value.inWindow){const t=30-e.value.inWindow.length;t>0&&this._loadMoreMessages(t)}})),super.listen(e)}async fetchInitial(e){const t=this.onlyUsedInternally?1:30,s=await ge({realtimeClient:this.realtimeClient,conversationId:this.conversationId,count:t});return s.ok?null===s.value.messages?b({lastChanged:e,stores:null,inWindow:null,windowEnd:null}):ve({seq:e,messages:s.value.messages,cursor:s.value.nextCursor,conversationId:this.conversationId,realtimeClient:this.realtimeClient}):s}teardownNested(e){be(e)}equal(e,t){return null===e.stores&&null===t.stores||null!==e.stores&&null!==t.stores&&(!!G(Object.keys(e.stores),Object.keys(t.stores))&&(!!G(e.inWindow.map((e=>e.messageId)),t.inWindow.map((e=>e.messageId)))&&G(e.windowEnd,t.windowEnd)))}async loadNested(e,t){if(null===t.stores)return b({snapshot:null,loadedAll:!0,lastChanged:t.lastChanged});const s=await Promise.all(t.inWindow.map((t=>t.getDeep(e)))),n=s.find((e=>!e.ok));if(n)return n;const r=s,i=r.filter((e=>null!==e.value.snapshot)).map((e=>e.value.snapshot)),a=Math.max(t.lastChanged,...r.map((e=>e.value.lastChanged)));return b({snapshot:i,loadedAll:null===t.windowEnd,lastChanged:a})}async loadMore(e){if(this.pendingLoadMore)return this.pendingLoadMore;const t=o();this.pendingLoadMore=t.promise,await this._loadMoreMessages(e),t.resolve(),this.pendingLoadMore=void 0}async _loadMoreMessages(e=30){const t=await this.lastState.resultPromise;if(!t.ok)return;if(null===t.value.windowEnd)return;const s=t.value.windowEnd.cursor,n=await ge({count:e,cursor:s,conversationId:this.conversationId,realtimeClient:this.realtimeClient}),r=this.lastState.seq+1e-6;this.mutate(r,(e=>null===e.value.windowEnd||s!==e.value.windowEnd.cursor?e:n.ok?null===n.value.messages?(console.warn("[TalkJS] When loading more messages, the conversation no longer existed. We should have been told about this."),e):ve({seq:r,prevState:e.value,messages:n.value.messages,cursor:n.value.nextCursor,conversationId:this.conversationId,realtimeClient:this.realtimeClient}):n)),await this.emitMutex.runExclusive((()=>this.emit(r)))}messageCreated(e,t){this.mutate(e,(s=>{if(null===s.value.stores)return console.warn("[TalkJS] Received a 'message.created' event for a nonexistent conversation."),s;if(s.value.windowEnd&&t.state.createdAt<s.value.windowEnd.oldestMessageTs)return s;if(Object.hasOwnProperty.call(s.value.stores,t.state.id))return s;const n={...s.value.stores},r=new pe(e,this.conversationId,t.state,this.realtimeClient);n[t.state.id]=r;const i=t.state.referencedMessageId;let a;null===i?a=null:i in n?a=n[i]:(a=new pe(e,this.conversationId,i,this.realtimeClient),n[i]=a);const o=new fe(e,t.state.createdAt,r,a),u=[...s.value.inWindow,o];u.sort(((e,t)=>t.createdAt-e.createdAt));return b({lastChanged:e,stores:n,inWindow:u,windowEnd:s.value.windowEnd})}))}messageEdited(e,t){this.mutate(e,(s=>null===s.value.stores?(console.warn("[TalkJS] Received a 'message.edited' event for a nonexistent conversation."),s):(s.value.stores[t.messageId]?.messageEdited(e,t),s)))}messageDeleted(e,t){this.mutate(e,(s=>{if(null===s.value.stores)return console.warn("[TalkJS] Received a 'message.deleted' event for a conversation that we thought didn't exist."),s;if(Object.values(s.value.stores).forEach((s=>s.messageDeleted(e,t))),void 0===s.value.stores[t.messageId])return s;const n={...s.value.stores};delete n[t.messageId];const r=s.value.inWindow.filter((e=>e.messageId!==t.messageId));if(t.newLastMessage){const s=new pe(e,this.conversationId,t.newLastMessage,this.realtimeClient);n[s.messageId]=s;const i=t.newLastMessage.referencedMessageId;let a;null===i?a=null:i in n?a=n[i]:(a=new pe(e,this.conversationId,i,this.realtimeClient),n[i]=a);const o=new fe(e,t.newLastMessage.createdAt,s,a);r.push(o)}return b({lastChanged:e,stores:n,inWindow:r,windowEnd:s.value.windowEnd})}))}conversationCleared(e,t){this.mutate(e,(t=>(be(t.value),b({lastChanged:e,stores:{},inWindow:[],windowEnd:null}))))}sideCreated(e,t){const s=this.fetchInitial(e);this.mutate(e,(e=>null!==e.value.stores?(s.then((e=>{e.ok&&be(e.value)})),e):s))}sideDeleted(e,t){this.mutate(e,(t=>(be(t.value),b({lastChanged:e,stores:null,inWindow:null,windowEnd:null}))))}async getMessageFromCache(e){const t=await this.lastState.resultPromise;if(!t.ok)return A("NOT_IN_CACHE");if(null===t.value.stores)return A("NOT_IN_CACHE");const s=t.value.stores[e];return void 0===s?A("NOT_IN_CACHE"):s.getFromCache()}}async function ge({cursor:e,realtimeClient:t,conversationId:s,count:n}){const r={limit:n,cursor:e},i=await t.call("GET",["me","conversations",s,"messages"],r,{bypassCache:!0});if(i.ok){const{data:e,cursor:t}=i.value.data;return b({messages:e,nextCursor:t})}return(i.ok||"server"!==i.where||404!==i.value.status)&&(i.ok||"server"!==i.where||403!==i.value.status||"NOT_A_PARTICIPANT"!==i.value.errorCode)?i:b({messages:null,nextCursor:null})}function ve({seq:e,prevState:t,messages:s,cursor:n,conversationId:r,realtimeClient:i}){const a=t?{...t.stores}:{};for(const t of s)if(void 0===a[t.id]){const s=new pe(e,r,t,i);a[s.messageId]=s}for(const t of s){const s=t.referencedMessageId;if(s&&void 0===a[s]){const t=new pe(e,r,s,i);a[t.messageId]=t}}const o=t?[...t.inWindow]:[];for(const t of s)o.push(new fe(e,t.createdAt,a[t.id],t.referencedMessageId?a[t.referencedMessageId]:null));if(o.sort(((e,t)=>t.createdAt-e.createdAt)),null===n)return b({lastChanged:e,stores:a,inWindow:o,windowEnd:null});return b({lastChanged:e,stores:a,inWindow:o,windowEnd:{cursor:n,oldestMessageTs:s[s.length-1].createdAt}})}function be(e){if(e.stores){const t=A("TERMINATED");Object.values(e.stores).forEach((e=>e.setError(t))),e.inWindow.forEach((e=>e.setError(t)))}}class Ae extends J{constructor(e,t,s,n,r){super(e,t,r),this.conversationId=s,this.realtimeClient=n,this.unsubscribeDebounceMs=5e3}async fetchInitial(e){const t=this.realtimeClient.internalSubscribe(["me","conversations",this.conversationId,"messages"]),s=await this.realtimeClient.call("GET",["me","conversations",this.conversationId],{},{bypassCache:!0});let n;if(s.ok)n=s.value.data;else if("server"===s.where&&404===s.value.status)n=null;else{if("server"!==s.where||403!==s.value.status||"NOT_A_PARTICIPANT"!==s.value.errorCode)return t.unsubscribe(),s;n=null}return b({lastChanged:e,snapshot:n,messageWindowStore:t})}teardownNested(e){e.messageWindowStore?.unsubscribe()}equal(e,t){return G(e.snapshot,t.snapshot)}async loadNested(e,t){if(!t.snapshot)return b({lastChanged:t.lastChanged,snapshot:null,loadedAll:!0});const s=await t.messageWindowStore.store.getDeep(e);if(!s.ok)return s;const n=s.value.snapshot,r=n?.[0]??null;return b({lastChanged:Math.max(t.lastChanged,s.value.lastChanged),snapshot:{...t.snapshot,lastMessage:r}})}participantEdited(e,t){this.mutate(e,(s=>null===s.value.snapshot?(console.warn("[TalkJS] Received a 'participant.edited' event for a conversation that we thought didn't exist."),s):b({lastChanged:e,snapshot:we(s.value.snapshot,t.diff),messageWindowStore:s.value.messageWindowStore})))}conversationEdited(e,t){this.mutate(e,(s=>null===s.value.snapshot?(console.warn("[TalkJS] Received a 'conversation.edited' event for a conversation that we thought didn't exist."),s):b({lastChanged:e,snapshot:we(s.value.snapshot,t.diff),messageWindowStore:s.value.messageWindowStore})))}sideEdited(e,t){this.mutate(e,(s=>null===s.value.snapshot?(console.warn("[TalkJS] Received a 'side.edited' event for a conversation that we thought didn't exist."),s):b({lastChanged:e,snapshot:we(s.value.snapshot,t.diff),messageWindowStore:s.value.messageWindowStore})))}sideCreated(e,t){this.mutate(e,(s=>s.value.snapshot?s:b({lastChanged:e,snapshot:t.state,messageWindowStore:s.value.messageWindowStore})))}sideDeleted(e,t){this.mutate(e,(t=>null===t.value.snapshot?t:b({lastChanged:e,snapshot:null,messageWindowStore:t.value.messageWindowStore})))}async getFromCache(){const e=await this.lastState.resultPromise;return e.ok&&e.value.snapshot?b({status:200,data:e.value.snapshot}):A("NOT_IN_CACHE")}}function we(e,t){const s=t;return{id:e.id,createdAt:e.createdAt,subject:W(e.subject,s.subject),photoUrl:W(e.photoUrl,s.photoUrl),welcomeMessages:W(e.welcomeMessages,s.welcomeMessages),custom:q(e.custom,s.custom),lastMessageAt:W(e.lastMessageAt,s.lastMessageAt),unreadMessageCount:W(e.unreadMessageCount,s.unreadMessageCount),isUnread:W(e.isUnread,s.isUnread),access:W(e.access,s.access),notify:W(e.notify,s.notify),joinedAt:e.joinedAt}}class ye{constructor(e,t,s,n,r){this.realtimeClient=r,this.userStores={},this.messageWindowStores={},this.conversationStores={},this.emitMutex=new H,this.seqOffset=0,this.seqInThisConnection=0,this.refetchOnNextNetworkLoss=!0,this.connection=new L(e,t,s,n,{onUpstreamRestarting:()=>{this.refetchOnNextNetworkLoss=!1},onReady:()=>{this.refetchOnNextNetworkLoss=!0},onResubscribeSent:()=>{if(this.seqOffset+=this.seq,this.seqInThisConnection=0,this.refetchOnNextNetworkLoss){this.seqOffset++;const e=this.seq;this.refetchAll(e),this.emitAll(e)}},onResubscribeError:(e,t)=>{this.getStoreIfExists(e)?.setError(t)},onPublish:(e,t)=>{this.seqInThisConnection=e;const s=this.seq;for(const e of t)this.handlePublish(s,e);this.emitAll(s)}})}get seq(){return this.seqOffset+this.seqInThisConnection}refetchAll(e){for(const t of Object.values(this.userStores))t.refetch(e);for(const t of Object.values(this.messageWindowStores))t.refetch(e);for(const t of Object.values(this.conversationStores))t.refetch(e)}emitAll(e){return this.emitMutex.runExclusive((async()=>{await Promise.all([...Object.values(this.userStores).map((t=>t.emit(e))),...Object.values(this.messageWindowStores).map((t=>t.emit(e))),...Object.values(this.conversationStores).map((t=>t.emit(e)))])}))}handlePublish(e,t){switch(t.type){case"user.created":return this.handleUserCreated(e,t);case"user.edited":return this.handleUserEdited(e,t);case"side.created":return this.handleSideCreated(e,t);case"side.edited":return this.handleSideEdited(e,t);case"side.deleted":return this.handleSideDeleted(e,t);case"participant.edited":return this.handleParticipantEdited(e,t);case"conversation.edited":return this.handleConversationEdited(e,t);case"message.created":return this.handleMessageCreated(e,t);case"message.edited":return this.handleMessageEdited(e,t);case"message.deleted":return this.handleMessageDeleted(e,t);case"messages.cleared":case"conversation.cleared":return this.handleConversationCleared(e,t)}}handleUserCreated(e,t){const s=this.userStores[t.userId];s&&s.userCreated(e,t)}handleUserEdited(e,t){const s=this.userStores[t.userId];s&&s.userEdited(e,t)}handleSideCreated(e,t){const s=this.messageWindowStores[t.conversationId];s&&s.sideCreated(e,t);const n=this.conversationStores[t.conversationId];n&&n.sideCreated(e,t)}handleSideEdited(e,t){const s=this.conversationStores[t.conversationId];s&&s.sideEdited(e,t)}handleParticipantEdited(e,t){const s=this.conversationStores[t.conversationId];s&&s.participantEdited(e,t)}handleConversationEdited(e,t){const s=this.conversationStores[t.conversationId];s&&s.conversationEdited(e,t)}handleSideDeleted(e,t){const s=this.messageWindowStores[t.conversationId];s&&s.sideDeleted(e,t);const n=this.conversationStores[t.conversationId];n&&n.sideDeleted(e,t)}handleMessageCreated(e,t){const s=this.messageWindowStores[t.conversationId];s&&s.messageCreated(e,t)}handleMessageEdited(e,t){const s=this.messageWindowStores[t.conversationId];s&&s.messageEdited(e,t)}handleMessageDeleted(e,t){const s=this.messageWindowStores[t.conversationId];s&&s.messageDeleted(e,t)}handleConversationCleared(e,t){const s=this.messageWindowStores[t.conversationId];s&&s.conversationCleared(e,t)}async call(t,s,n,r){if(!r.bypassCache){if("GET"===t&&e(s,["users","*"])){const e=s[1],t=this.userStores[e];if(t){const e=await t.getFromCache();if("NOT_IN_CACHE"!==e.value)return e}}if("GET"===t&&e(s,["me","conversations","*","messages","*"])){const e=s[2],t=this.messageWindowStores[e];if(t){const e=s[3],n=await t.getMessageFromCache(e);if("NOT_IN_CACHE"!==n.value)return n}}}return this.connection.call(t,s,n)}subscribe(e,t){const n=this.getOrCreateStore(e),r=o(),i=o();r.promise.catch((()=>{})),i.promise.catch((()=>{}));const a={state:{type:"pending",latestSnapshot:void 0},connected:r.promise,terminated:i.promise,loadMore:async e=>{"loadMore"in n&&await n.loadMore(e)},unsubscribe:()=>{}},u=n.listen((n=>{if(n.ok){const e=!("loadedAll"in n.value)||n.value.loadedAll,s={type:"active",latestSnapshot:n.value.snapshot,loadedAll:e};a.state=s,t?.(n.value.snapshot,e),r.resolve(s)}else if("pending"===a.state.type||"active"===a.state.type){if("server"===n.where){const t={type:"error",error:new Error(s(`Subscribe to ${e.join("/")}`,n.value))};return a.state=t,i.resolve(t),void r.reject("Subscription encountered an error during initial connection")}if("SESSION_DESTROYED"===n.value){const e={type:"error",error:new Error("Session was destroyed causing all subscriptions to be terminated")};return a.state=e,i.resolve(e),void r.reject("Subscription encountered an error during initial connection")}if("UNSUBSCRIBED"===n.value)return;if("TERMINATED"===n.value)return;n.value}}));return a.unsubscribe=()=>{if("pending"===a.state.type||"active"===a.state.type){u();const e={type:"unsubscribed"};a.state=e,i.resolve(e),r.reject("Subscription was unsubscribed before connecting")}},a}getOrCreateStore(t){if(e(t,["users","*"])){const e=t[1];if(Object.hasOwnProperty.call(this.userStores,e))return this.userStores[e];{this.connection.subscribe(["users",e]).then((e=>{e.ok||s.setError(e)}));const t=this.seq,s=new Y(t,e,this.realtimeClient,this.emitMutex,(()=>{delete this.userStores[e],this.connection.unsubscribe(["users",e])}));return this.userStores[e]=s,s}}if(e(t,["me","conversations","*"])){const e=t[2];if(Object.hasOwnProperty.call(this.conversationStores,e))return this.conversationStores[e];{this.connection.subscribe(["me","conversations",e]).then((e=>{e.ok||t.setError(e)}));const t=new Ae(this.seq,this.emitMutex,e,this.realtimeClient,(()=>{delete this.conversationStores[e],this.connection.unsubscribe(["me","conversations",e])}));return this.conversationStores[e]=t,t}}if(e(t,["me","conversations","*","messages"])){const e=t[2];if(Object.hasOwnProperty.call(this.messageWindowStores,e))return this.messageWindowStores[e];{this.connection.subscribe(["me","conversations",e,"messages"]).then((e=>{e.ok||t.setError(e)}));const t=new me(this.seq,this.emitMutex,e,this.realtimeClient,(()=>{delete this.messageWindowStores[e],this.connection.unsubscribe(["me","conversations",e,"messages"])}));return this.messageWindowStores[e]=t,t}}throw new Error("Unrecognised subscribe path: "+t)}getStoreIfExists(t){if(e(t,["users","*"])){const e=t[1];return this.userStores[e]??null}if(e(t,["me","conversations","*","messages"])){const e=t[2];return this.messageWindowStores[e]??null}throw new Error("Unrecognised subscribe path: "+t)}destroy(){this.userStores={},this.messageWindowStores={},this.connection.destroy()}isConnected(){return this.connection.isConnected()}}class Ce{constructor(e,t,s,n,r){this.userId=s,this.renderOptions=r,this.alive=!0,this.connection=new ye(e,t,s,n,this),n.onTokenRefreshFailed((()=>{this.destroy()}))}async call(e,t,s,n={}){return this.alive?this.connection.call(e,t,s,n):A("SESSION_DESTROYED")}subscribe(e,t){return this.connection.subscribe(e,t)}internalSubscribe(e){const t=this.connection.getOrCreateStore(e);return{store:t,unsubscribe:t.registerInternalSubscription()}}destroy(){this.alive=!1,this.connection.destroy()}isConnected(){return this.connection.isConnected()}async listMessages(e,t){const s=await this.call("GET",["me","conversations",e,"messages"],t);if(!s.ok)return Ee(s,"Listing messages in "+e);const n=s.value.data.data,r=await Promise.all(n.map((t=>this.createMessageSnapshot(t,e)))),i=r.find((e=>!e.ok));if(void 0!==i&&!i.ok)return i;return b(r.map((({value:e})=>e)))}createConversationSnapshotPreloaded(e,t){return{id:e.id,subject:e.subject,photoUrl:e.photoUrl,welcomeMessages:e.welcomeMessages,custom:e.custom,createdAt:e.createdAt,joinedAt:e.joinedAt,lastMessageAt:e.lastMessageAt,unreadMessageCount:e.unreadMessageCount,isUnread:e.isUnread,access:e.access,notify:e.notify,lastMessage:t}}createUserSnapshot(e){return{id:e.id,name:e.name,custom:e.custom,locale:e.locale,photoUrl:e.photoUrl,role:e.role,welcomeMessage:e.welcomeMessage}}createParticipantSnapshotPreloaded(e,t){return"None"===e.access?null:{user:t,access:e.access,notify:e.notify,joinedAt:e.joinedAt}}async createMessageSnapshot(e,t){const s=null===e.senderId?Promise.resolve(b(null)):this.getUser(e.senderId),n=null===e.referencedMessageId?Promise.resolve(b(null)):this.getReferencedMessage(t,e.referencedMessageId),r=await s;if(!r.ok)return r;const i=await n;if(!i.ok)return i;return b(this.createMessageSnapshotPreloaded(e,r.value,i.value))}async getReferencedMessage(e,t){const s=await this.call("GET",["me","conversations",e,"messages",t],{});if(!s.ok&&"server"===s.where&&404===s.value.status)return b(null);if(!s.ok&&"server"===s.where&&403===s.value.status&&"NOT_A_PARTICIPANT"===s.value.errorCode)return b(null);if(!s.ok)return Ee(s,`Fetching referenced message ${t} in conversation ${e}`);const n=s.value.data,r=await this.getUser(n.senderId);if(!r.ok)return r;const i=r.value;return b(this.createReferencedMessageSnapshotPreloaded(n,i))}async getUser(e){const t=await this.call("GET",["users",e],{includePrivateFields:!1});if(!t.ok&&"server"===t.where&&404===t.value.status)return b(null);if(!t.ok)return Ee(t,"Get user "+e);return b(this.createUserSnapshot(t.value.data))}createMessageSnapshotPreloaded(e,t,s){return{id:e.id,type:e.type,sender:t,referencedMessage:s,custom:e.custom,createdAt:e.createdAt,editedAt:e.editedAt,origin:e.origin,content:e.content,plaintext:he(e.content,this.renderOptions)}}createReferencedMessageSnapshotPreloaded(e,t){return{id:e.id,type:e.type,sender:t,referencedMessageId:e.referencedMessageId,custom:e.custom,createdAt:e.createdAt,editedAt:e.editedAt,origin:e.origin,content:e.content,plaintext:he(e.content,this.renderOptions)}}}function Ee(e,t){return"server"===e.where?w({...e.value,operation:t}):e}function ke(e,t){if(t.ok)return t.value;throw"SESSION_DESTROYED"===t.value?new Error(`${e} failed because the session was destroyed`):new Error(s(t.value.operation??e,t.value))}class xe{constructor(e,t){this.id=e,this._realtimeClient=t}get brandedId(){return this.id}async get(){const e=await this._realtimeClient.getUser(this.brandedId);return ke("Get user "+this.id,e)}async set(e){null===e.role&&(e.role="default");const s=await this._realtimeClient.call("PUT",["users",this.brandedId],e);t("Set user "+this.id,s)}async createIfNotExists(e){void 0===e.role&&(e.role="default");const s=await this._realtimeClient.call("POST",["users",this.brandedId],e);(s.ok||"server"!==s.where||409!=s.value.status)&&t(`Create user ${this.id} if not exists`,s)}subscribe(e){return this._realtimeClient.subscribe(["users",this.brandedId],e)}}class Se{constructor(e,t,s){this.userId=e,this.conversationId=t,this._realtimeClient=s}get brandedUserId(){return this.userId}get brandedConversationId(){return this.conversationId}async get(){const e=await this._realtimeClient.call("GET",["me","conversations",this.brandedConversationId,"participants",this.brandedUserId],{}),s=await this._realtimeClient.call("GET",["users",this.brandedUserId],{includePrivateFields:!1}),[n,r]=await Promise.all([e,s]);if(!n.ok&&"server"===n.where&&404===n.value.status)return null;if(!r.ok&&"server"===r.where&&404===r.value.status)return null;const i=t(`Get participant ${this.userId} in conversation ${this.conversationId}`,n),a=t(`Get user ${this.userId}`,r),o=this._realtimeClient.createUserSnapshot(a);return this._realtimeClient.createParticipantSnapshotPreloaded(i,o)}async set(e={}){const s=await this._realtimeClient.call("PUT",["conversations",this.brandedConversationId,"participants",this.brandedUserId],e);t(`Set participant ${this.userId} in conversation ${this.conversationId}`,s)}async edit(e={}){const s=await this._realtimeClient.call("PATCH",["conversations",this.brandedConversationId,"participants",this.brandedUserId],e);t(`Edit participant ${this.userId} in conversation ${this.conversationId}`,s)}async createIfNotExists(e={}){const s=await this._realtimeClient.call("POST",["conversations",this.brandedConversationId,"participants",this.brandedUserId],e);(s.ok||"server"!==s.where||409!==s.value.status)&&t(`Add participant ${this.userId} to conversation ${this.conversationId}`,s)}async delete(){const e=await this._realtimeClient.call("DELETE",["conversations",this.brandedConversationId,"participants",this.brandedUserId],{});(e.ok||"server"!==e.where||404!==e.value.status)&&t(`Remove participant ${this.userId} from conversation ${this.conversationId}`,e)}}function Te(e){const t="-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz";let s=0;const n=[],r=e===s;s=e;const i=new Array(8);for(let s=7;s>=0;s--)i[s]=t.charAt(e%64),e=Math.floor(e/64);if(0!==e)throw new Error("We should have converted the entire timestamp.");let a=i.join("");if(r){let e;for(e=11;e>=0&&63===n[e];e--)n[e]=0;n[e]++}else for(let e=0;e<12;e++)n[e]=Math.floor(64*Math.random());for(let e=0;e<12;e++)a+=t.charAt(n[e]);if(20!=a.length)throw new Error("Length should be 20.");return a}const Ie=(e,t,s=void 0)=>function(e,t){return e.reduce(((e,s,n)=>e.concat(t(s,n))),[])}(e,(e=>{if("string"==typeof e)return t(e,s);switch(e.type){case"bold":case"italic":case"strikethrough":case"blockquote":case"bulletlist":case"bulletList":case"bulletpoint":case"bulletPoint":return[{type:e.type,children:Ie(e.children,t,e.type)}];case"link":return[{type:e.type,url:e.url,children:Ie(e.children,t,e.type)}];case"actionlink":case"actionLink":case"actionbutton":case"actionButton":return[{type:e.type,action:e.action,params:e.params,children:Ie(e.children,t,e.type)}];case"mention":case"autolink":case"autoLink":case"codeblock":case"codeBlock":case"codespan":case"codeSpan":case"suppressed":case"emoji":case"customemoji":case"customEmoji":return[e]}}));function De(e,t){return s=>{const n=s;let r=0;const i=[];for(const a of ne(s,e)){a.index-r>0&&i.push(n.substring(r,a.index));const e=t(a);Array.isArray(e)?i.push(...e):i.push(e),r=a.index+a[0].length}return r<s.length&&i.push(s.substring(r)),i}}const Fe="’'()[]{}<>:,‒–—―…!.«»-‐?‘’“”;/⁄␠·&@*\\•^¤¢$€£¥₩₪†‡°¡¿¬#№%‰‱¶′§~¨_|¦⁂☞∴‽※".replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&");var Oe=(e=>(e[e.italic=1]="italic",e[e.strikethrough=2]="strikethrough",e[e.bold=4]="bold",e))(Oe||{});const Me=[0,1,2,3,4,5,6].map((e=>{const t=[];return 1&e||t.push(/_([^\s_].*?[^\s_])_|_([^\s_])_/),2&e||t.push(/~([^\s~].*?[^\s~])~|~([^\s~])~/),4&e||t.push(/\*([^\s*].*?[^\s*])\*|\*([^\s*])\*/),new RegExp(t.map((e=>e.source)).join("|"),"g")})),Be={_:1,"*":4,"~":2};function _e(e){return Re(e,0)}function Re(e,t=0){const s=Me[t],n=s?function(e){const t=Ne.getOrCompute(e,(()=>new RegExp(`(?:^|[\\s${Fe}])(?:${e.source})(?=[\\s${Fe}]|$)`,"g"))),s=De(t,(e=>{const t=e[0][1],s=e[1]||e[2]||e[3]||e[4]||e[5]||e[6];return[" ",{type:Oe[Be[t]],children:[s]}]}));return e=>{const[t,...n]=s(" "+e);return t.length>1&&n.unshift(t.substring(1)),n}}(s):()=>[e];return Ie(n(e),((e,s)=>"bold"===s||"italic"===s||"strikethrough"===s?Re(e,t|Oe[s]):[e]))}const Ne=function(){const e=function(){try{return new WeakMap}catch(e){const t={has:()=>!1,get:()=>{},set:()=>t};return t}}();return{getOrCompute(t,s){if(e.has(t))return e.get(t);const n=s();return e.set(t,n),n}}}();function Pe(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var s=0,n=e.length;s<n;s++)if(e[s]===t)return s;return-1}function Ue(e,t){for(var s=e.length-1;s>=0;s--)!0===t(e[s])&&e.splice(s,1)}function je(e){throw new Error("Unhandled case for value: '"+e+"'")}var $e=function(){function e(e){void 0===e&&(e={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=e.tagName||"",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||""}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||""},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr("class",e)},e.prototype.addClass=function(e){for(var t,s=this.getClass(),n=this.whitespaceRegex,r=s?s.split(n):[],i=e.split(n);t=i.shift();)-1===Pe(r,t)&&r.push(t);return this.getAttrs().class=r.join(" "),this},e.prototype.removeClass=function(e){for(var t,s=this.getClass(),n=this.whitespaceRegex,r=s?s.split(n):[],i=e.split(n);r.length&&(t=i.shift());){var a=Pe(r,t);-1!==a&&r.splice(a,1)}return this.getAttrs().class=r.join(" "),this},e.prototype.getClass=function(){return this.getAttrs().class||""},e.prototype.hasClass=function(e){return-1!==(" "+this.getClass()+" ").indexOf(" "+e+" ")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||""},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return["<",e,t=t?" "+t:"",">",this.getInnerHtml(),"</",e,">"].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var s in e)e.hasOwnProperty(s)&&t.push(s+'="'+e[s]+'"');return t.join(" ")},e}();var Le=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||""}return e.prototype.build=function(e){return new $e({tagName:"a",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},s=this.createCssClass(e);return s&&(t.class=s),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var s=[t],n=e.getCssClassSuffixes(),r=0,i=n.length;r<i;r++)s.push(t+"-"+n[r]);return s.join(" ")}return""},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var s=t.length,n=t.location;return"smart"===n?function(e,t,s){var n,r;null==s?(s="…",r=3,n=8):(r=s.length,n=s.length);var i=function(e){var t="";return e.scheme&&e.host&&(t+=e.scheme+"://"),e.host&&(t+=e.host),e.path&&(t+="/"+e.path),e.query&&(t+="?"+e.query),e.fragment&&(t+="#"+e.fragment),t},a=function(e,t){var n=t/2,r=Math.ceil(n),i=-1*Math.floor(n),a="";return i<0&&(a=e.substr(i)),e.substr(0,r)+s+a};if(e.length<=t)return e;var o=t-r,u=function(e){var t={},s=e,n=s.match(/^([a-z]+):\/\//i);return n&&(t.scheme=n[1],s=s.substr(n[0].length)),(n=s.match(/^(.*?)(?=(\?|#|\/|$))/i))&&(t.host=n[1],s=s.substr(n[0].length)),(n=s.match(/^\/(.*?)(?=(\?|#|$))/i))&&(t.path=n[1],s=s.substr(n[0].length)),(n=s.match(/^\?(.*?)(?=(#|$))/i))&&(t.query=n[1],s=s.substr(n[0].length)),(n=s.match(/^#(.*?)$/i))&&(t.fragment=n[1]),t}(e);if(u.query){var c=u.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i);c&&(u.query=u.query.substr(0,c[1].length),e=i(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\./,""),e=i(u)),e.length<=t)return e;var l="";if(u.host&&(l+=u.host),l.length>=o)return u.host.length==t?(u.host.substr(0,t-r)+s).substr(0,o+n):a(l,o).substr(0,o+n);var h="";if(u.path&&(h+="/"+u.path),u.query&&(h+="?"+u.query),h){if((l+h).length>=o)return(l+h).length==t?(l+h).substr(0,t):(l+a(h,o-l.length)).substr(0,o+n);l+=h}if(u.fragment){var d="#"+u.fragment;if((l+d).length>=o)return(l+d).length==t?(l+d).substr(0,t):(l+a(d,o-l.length)).substr(0,o+n);l+=d}if(u.scheme&&u.host){var p=u.scheme+"://";if((l+p).length<o)return(p+l).substr(0,t)}if(l.length<=t)return l;var f="";return o>0&&(f=l.substr(-1*Math.floor(o/2))),(l.substr(0,Math.ceil(o/2))+s+f).substr(0,o+n)}(e,s):"middle"===n?function(e,t,s){if(e.length<=t)return e;var n,r;null==s?(s="…",n=8,r=3):(n=s.length,r=s.length);var i=t-r,a="";return i>0&&(a=e.substr(-1*Math.floor(i/2))),(e.substr(0,Math.ceil(i/2))+s+a).substr(0,i+n)}(e,s):function(e,t,s){return function(e,t,s){var n;return e.length>t&&(null==s?(s="…",n=3):n=s.length,e=e.substring(0,t-n)+s),e}(e,t,s)}(e,s)},e}(),We=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),qe=function(e,t){return qe=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var s in t)t.hasOwnProperty(s)&&(e[s]=t[s])},qe(e,t)};function Ge(e,t){function s(){this.constructor=e}qe(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}var He,ze=function(){return ze=Object.assign||function(e){for(var t,s=1,n=arguments.length;s<n;s++)for(var r in t=arguments[s])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e},ze.apply(this,arguments)},Je=function(e){function t(t){var s=e.call(this,t)||this;return s.email="",s.email=t.email,s}return Ge(t,e),t.prototype.getType=function(){return"email"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return"mailto:"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(We),Ve=function(e){function t(t){var s=e.call(this,t)||this;return s.serviceName="",s.hashtag="",s.serviceName=t.serviceName,s.hashtag=t.hashtag,s}return Ge(t,e),t.prototype.getType=function(){return"hashtag"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case"twitter":return"https://twitter.com/hashtag/"+t;case"facebook":return"https://www.facebook.com/hashtag/"+t;case"instagram":return"https://instagram.com/explore/tags/"+t;default:throw new Error("Unknown service name to point hashtag to: "+e)}},t.prototype.getAnchorText=function(){return"#"+this.hashtag},t}(We),Ye=function(e){function t(t){var s=e.call(this,t)||this;return s.serviceName="twitter",s.mention="",s.mention=t.mention,s.serviceName=t.serviceName,s}return Ge(t,e),t.prototype.getType=function(){return"mention"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case"twitter":return"https://twitter.com/"+this.mention;case"instagram":return"https://instagram.com/"+this.mention;case"soundcloud":return"https://soundcloud.com/"+this.mention;default:throw new Error("Unknown service name to point mention to: "+this.serviceName)}},t.prototype.getAnchorText=function(){return"@"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),s=this.getServiceName();return s&&t.push(s),t},t}(We),Ke=function(e){function t(t){var s=e.call(this,t)||this;return s.number="",s.plusSign=!1,s.number=t.number,s.plusSign=t.plusSign,s}return Ge(t,e),t.prototype.getType=function(){return"phone"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return"tel:"+(this.plusSign?"+":"")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(We),Qe=function(e){function t(t){var s=e.call(this,t)||this;return s.url="",s.urlMatchType="scheme",s.protocolUrlMatch=!1,s.protocolRelativeMatch=!1,s.stripPrefix={scheme:!0,www:!0},s.stripTrailingSlash=!0,s.decodePercentEncoding=!0,s.schemePrefixRegex=/^(https?:\/\/)?/i,s.wwwPrefixRegex=/^(https?:\/\/)?(www\.)?/i,s.protocolRelativeRegex=/^\/\//,s.protocolPrepended=!1,s.urlMatchType=t.urlMatchType,s.url=t.url,s.protocolUrlMatch=t.protocolUrlMatch,s.protocolRelativeMatch=t.protocolRelativeMatch,s.stripPrefix=t.stripPrefix,s.stripTrailingSlash=t.stripTrailingSlash,s.decodePercentEncoding=t.decodePercentEncoding,s}return Ge(t,e),t.prototype.getType=function(){return"url"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url="http://"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&/g,"&")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,"")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,"$1")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,"")},t.prototype.removeTrailingSlash=function(e){return"/"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,""").replace(/%26/gi,"&").replace(/%27/gi,"'").replace(/%3C/gi,"<").replace(/%3E/gi,">");try{return decodeURIComponent(t)}catch(e){return t}},t}(We),Ze=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},Xe=/[A-Za-z]/,et=/[\d]/,tt=/[\D]/,st=/\s/,nt=/['"]/,rt=/[\x00-\x1F\x7F]/,it=/A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/.source,at=it+/\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/.source+/\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/.source,ot=/0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/.source,ut=at+ot,ct=at+ot,lt="(?:["+ot+"]{1,3}\\.){3}["+ot+"]{1,3}",ht="["+ct+"](?:["+ct+"\\-]{0,61}["+ct+"])?",dt=function(e){return"(?=("+ht+"))\\"+e},pt=function(e){return"(?:"+dt(e)+"(?:\\."+dt(e+1)+"){0,126}|"+lt+")"},ft=new RegExp("["+ct+"]"),mt=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,gt=new RegExp("["+ct+"!#$%&'*+/=?^_`{|}~-]"),vt=new RegExp("^"+mt.source+"$"),bt=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=gt,t.strictTldRegex=vt,t}return Ge(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,s=this.localPartCharRegex,n=this.strictTldRegex,r=[],i=e.length,a=new At,o={m:"a",a:"i",i:"l",l:"t",t:"o",o:":"},u=0,c=0,l=a;u<i;){var h=e.charAt(u);switch(c){case 0:d(h);break;case 1:p(e.charAt(u-1),h);break;case 2:f(h);break;case 3:m(h);break;case 4:g(h);break;case 5:v(h);break;case 6:b(h);break;case 7:A(h);break;default:je(c)}u++}return C(),r;function d(e){"m"===e?w(1):s.test(e)&&w()}function p(e,t){":"===e?s.test(t)?(c=2,l=new At(ze(ze({},l),{hasMailtoPrefix:!0}))):y():o[e]===t||(s.test(t)?c=2:"."===t?c=3:"@"===t?c=4:y())}function f(e){"."===e?c=3:"@"===e?c=4:s.test(e)||y()}function m(e){"."===e||"@"===e?y():s.test(e)?c=2:y()}function g(e){ft.test(e)?c=5:y()}function v(e){"."===e?c=7:"-"===e?c=6:ft.test(e)||C()}function b(e){"-"===e||"."===e?C():ft.test(e)?c=5:C()}function A(e){"."===e||"-"===e?C():ft.test(e)?(c=5,l=new At(ze(ze({},l),{hasDomainDot:!0}))):C()}function w(e){void 0===e&&(e=2),c=e,l=new At({idx:u})}function y(){c=0,l=a}function C(){if(l.hasDomainDot){var s=e.slice(l.idx,u);/[-.]$/.test(s)&&(s=s.slice(0,-1));var i=l.hasMailtoPrefix?s.slice(7):s;(function(e){var t=e.split(".").pop()||"",s=t.toLowerCase();return n.test(s)})(i)&&r.push(new Je({tagBuilder:t,matchedText:s,offset:l.idx,email:i}))}y()}},t}(Ze),At=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},wt=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split("://")[1]),t.split("/")[0].indexOf("..")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),s=t&&t[0].toLowerCase();return"javascript:"!==s&&"vbscript:"!==s},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf("."))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&(!this.hasFullProtocolRegex.test(t)&&!this.hasWordCharAfterProtocolRegex.test(e))},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+it+"]"),e.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,e}(),yt=(He=new RegExp("[/?#](?:["+ct+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^✓]*["+ct+"\\-+&@#/%=~_()|'$*\\[\\]{}✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,pt(2),")","|","(","(//)?",/(?:www\.)/.source,pt(6),")","|","(","(//)?",pt(10)+"\\.",mt.source,"(?![-"+ut+"])",")",")","(?::[0-9]+)?","(?:"+He.source+")?"].join(""),"gi")),Ct=new RegExp("["+ct+"]"),Et=function(e){function t(t){var s=e.call(this,t)||this;return s.stripPrefix={scheme:!0,www:!0},s.stripTrailingSlash=!0,s.decodePercentEncoding=!0,s.matcherRegex=yt,s.wordCharRegExp=Ct,s.stripPrefix=t.stripPrefix,s.stripTrailingSlash=t.stripTrailingSlash,s.decodePercentEncoding=t.decodePercentEncoding,s}return Ge(t,e),t.prototype.parseMatches=function(e){for(var t,s=this.matcherRegex,n=this.stripPrefix,r=this.stripTrailingSlash,i=this.decodePercentEncoding,a=this.tagBuilder,o=[],u=function(){var s=t[0],u=t[1],l=t[4],h=t[5],d=t[9],p=t.index,f=h||d,m=e.charAt(p-1);if(!wt.isValid(s,u))return"continue";if(p>0&&"@"===m)return"continue";if(p>0&&f&&c.wordCharRegExp.test(m))return"continue";if(/\?$/.test(s)&&(s=s.substr(0,s.length-1)),c.matchHasUnbalancedClosingParen(s))s=s.substr(0,s.length-1);else{var g=c.matchHasInvalidCharAfterTld(s,u);g>-1&&(s=s.substr(0,g))}var v=["http://","https://"].find((function(e){return!!u&&-1!==u.indexOf(e)}));if(v){var b=s.indexOf(v);s=s.substr(b),u=u.substr(b),p+=b}var A=u?"scheme":l?"www":"tld",w=!!u;o.push(new Qe({tagBuilder:a,matchedText:s,offset:p,urlMatchType:A,url:s,protocolUrlMatch:w,protocolRelativeMatch:!!f,stripPrefix:n,stripTrailingSlash:r,decodePercentEncoding:i}))},c=this;null!==(t=s.exec(e));)u();return o},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,s=e.charAt(e.length-1);if(")"===s)t="(";else if("]"===s)t="[";else{if("}"!==s)return!1;t="{"}for(var n=0,r=0,i=e.length-1;r<i;r++){var a=e.charAt(r);a===t?n++:a===s&&(n=Math.max(n-1,0))}return 0===n},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var s=0;t&&(s=e.indexOf(":"),e=e.slice(s));var n=new RegExp("^((.?//)?[-."+ct+"]*[-"+ct+"]\\.[-"+ct+"]+)").exec(e);return null===n?-1:(s+=n[1].length,e=e.slice(n[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(e)?s:-1)},t}(Ze),kt=new RegExp("#[_"+ct+"]{1,139}(?![_"+ct+"])","g"),xt=new RegExp("[^"+ct+"]"),St=function(e){function t(t){var s=e.call(this,t)||this;return s.serviceName="twitter",s.matcherRegex=kt,s.nonWordCharRegex=xt,s.serviceName=t.serviceName,s}return Ge(t,e),t.prototype.parseMatches=function(e){for(var t,s=this.matcherRegex,n=this.nonWordCharRegex,r=this.serviceName,i=this.tagBuilder,a=[];null!==(t=s.exec(e));){var o=t.index,u=e.charAt(o-1);if(0===o||n.test(u)){var c=t[0],l=t[0].slice(1);a.push(new Ve({tagBuilder:i,matchedText:c,offset:o,serviceName:r,hashtag:l}))}}return a},t}(Ze),Tt=new RegExp(/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/.source+"|"+/(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/.source,"g"),It=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=Tt,t}return Ge(t,e),t.prototype.parseMatches=function(e){for(var t,s=this.matcherRegex,n=this.tagBuilder,r=[];null!==(t=s.exec(e));){var i=t[0],a=i.replace(/[^0-9,;#]/g,""),o=!(!t[1]&&!t[2]),u=0==t.index?"":e.substr(t.index-1,1),c=e.substr(t.index+i.length,1),l=!u.match(/\d/)&&!c.match(/\d/);this.testMatch(t[3])&&this.testMatch(i)&&l&&r.push(new Ke({tagBuilder:n,matchedText:i,offset:t.index,number:a,plusSign:o}))}return r},t.prototype.testMatch=function(e){return tt.test(e)},t}(Ze),Dt=new RegExp("@[_"+ct+"]{1,50}(?![_"+ct+"])","g"),Ft=new RegExp("@[_."+ct+"]{1,30}(?![_"+ct+"])","g"),Ot=new RegExp("@[-_."+ct+"]{1,50}(?![-_"+ct+"])","g"),Mt=new RegExp("[^"+ct+"]"),Bt=function(e){function t(t){var s=e.call(this,t)||this;return s.serviceName="twitter",s.matcherRegexes={twitter:Dt,instagram:Ft,soundcloud:Ot},s.nonWordCharRegex=Mt,s.serviceName=t.serviceName,s}return Ge(t,e),t.prototype.parseMatches=function(e){var t,s=this.serviceName,n=this.matcherRegexes[this.serviceName],r=this.nonWordCharRegex,i=this.tagBuilder,a=[];if(!n)return a;for(;null!==(t=n.exec(e));){var o=t.index,u=e.charAt(o-1);if(0===o||r.test(u)){var c=t[0].replace(/\.+$/g,""),l=c.slice(1);a.push(new Ye({tagBuilder:i,matchedText:c,offset:o,serviceName:s,mention:l}))}}return a},t}(Ze);function _t(e,t){for(var s,n=t.onOpenTag,r=t.onCloseTag,i=t.onText,a=t.onComment,o=t.onDoctype,u=new Rt,c=0,l=e.length,h=0,d=0,p=u;c<l;){var f=e.charAt(c);switch(h){case 0:m(f);break;case 1:g(f);break;case 2:b(f);break;case 3:v(f);break;case 4:A(f);break;case 5:w(f);break;case 6:y(f);break;case 7:C(f);break;case 8:E(f);break;case 9:k(f);break;case 10:x(f);break;case 11:S(f);break;case 12:T(f);break;case 13:I();break;case 14:D(f);break;case 15:F(f);break;case 16:O(f);break;case 17:M(f);break;case 18:B(f);break;case 19:_(f);break;case 20:R(f);break;default:je(h)}c++}function m(e){"<"===e&&P()}function g(e){"!"===e?h=13:"/"===e?(h=2,p=new Rt(ze(ze({},p),{isClosing:!0}))):"<"===e?P():Xe.test(e)?(h=3,p=new Rt(ze(ze({},p),{isOpening:!0}))):(h=0,p=u)}function v(e){st.test(e)?(p=new Rt(ze(ze({},p),{name:j()})),h=4):"<"===e?P():"/"===e?(p=new Rt(ze(ze({},p),{name:j()})),h=12):">"===e?(p=new Rt(ze(ze({},p),{name:j()})),U()):Xe.test(e)||et.test(e)||":"===e||N()}function b(e){">"===e?N():Xe.test(e)?h=3:N()}function A(e){st.test(e)||("/"===e?h=12:">"===e?U():"<"===e?P():"="===e||nt.test(e)||rt.test(e)?N():h=5)}function w(e){st.test(e)?h=6:"/"===e?h=12:"="===e?h=7:">"===e?U():"<"===e?P():nt.test(e)&&N()}function y(e){st.test(e)||("/"===e?h=12:"="===e?h=7:">"===e?U():"<"===e?P():nt.test(e)?N():h=5)}function C(e){st.test(e)||('"'===e?h=8:"'"===e?h=9:/[>=`]/.test(e)?N():"<"===e?P():h=10)}function E(e){'"'===e&&(h=11)}function k(e){"'"===e&&(h=11)}function x(e){st.test(e)?h=4:">"===e?U():"<"===e&&P()}function S(e){st.test(e)?h=4:"/"===e?h=12:">"===e?U():"<"===e?P():(h=4,c--)}function T(e){">"===e?(p=new Rt(ze(ze({},p),{isClosing:!0})),U()):h=4}function I(t){"--"===e.substr(c,2)?(c+=2,p=new Rt(ze(ze({},p),{type:"comment"})),h=14):"DOCTYPE"===e.substr(c,7).toUpperCase()?(c+=7,p=new Rt(ze(ze({},p),{type:"doctype"})),h=20):N()}function D(e){"-"===e?h=15:">"===e?N():h=16}function F(e){"-"===e?h=18:">"===e?N():h=16}function O(e){"-"===e&&(h=17)}function M(e){h="-"===e?18:16}function B(e){">"===e?U():"!"===e?h=19:"-"===e||(h=16)}function _(e){"-"===e?h=17:">"===e?U():h=16}function R(e){">"===e?U():"<"===e&&P()}function N(){h=0,p=u}function P(){h=1,p=new Rt({idx:c})}function U(){var t=e.slice(d,p.idx);t&&i(t,d),"comment"===p.type?a(p.idx):"doctype"===p.type?o(p.idx):(p.isOpening&&n(p.name,p.idx),p.isClosing&&r(p.name,p.idx)),N(),d=c+1}function j(){var t=p.idx+(p.isClosing?2:1);return e.slice(t,c).toLowerCase()}d<c&&(s=e.slice(d,c),i(s,d),d=c+1)}var Rt=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||"tag",this.name=e.name||"",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},Nt=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:"end"},this.className="",this.replaceFn=null,this.context=void 0,this.sanitizeHtml=!1,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email="boolean"==typeof t.email?t.email:this.email,this.phone="boolean"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow="boolean"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash="boolean"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding="boolean"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding,this.sanitizeHtml=t.sanitizeHtml||!1;var s=this.mention;if(!1!==s&&"twitter"!==s&&"instagram"!==s&&"soundcloud"!==s)throw new Error("invalid `mention` cfg - see docs");var n=this.hashtag;if(!1!==n&&"twitter"!==n&&"facebook"!==n&&"instagram"!==n)throw new Error("invalid `hashtag` cfg - see docs");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,s){return new e(s).link(t)},e.parse=function(t,s){return new e(s).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),"boolean"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:"boolean"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:"boolean"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:"boolean"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),"boolean"==typeof e?{scheme:e,www:e}:{scheme:"boolean"!=typeof e.scheme||e.scheme,www:"boolean"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return"number"==typeof e?{length:e,location:"end"}:function(e,t){for(var s in t)t.hasOwnProperty(s)&&void 0===e[s]&&(e[s]=t[s]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:"end"})},e.prototype.parse=function(e){var t=this,s=["a","style","script"],n=0,r=[];return _t(e,{onOpenTag:function(e){s.indexOf(e)>=0&&n++},onText:function(e,s){if(0===n){var i=function(e,t){if(!t.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var s,n=[],r=0;s=t.exec(e);)n.push(e.substring(r,s.index)),n.push(s[0]),r=s.index+s[0].length;return n.push(e.substring(r)),n}(e,/( | |<|<|>|>|"|"|')/gi),a=s;i.forEach((function(e,s){if(s%2==0){var n=t.parseText(e,a);r.push.apply(r,n)}a+=e.length}))}},onCloseTag:function(e){s.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),r=this.compactMatches(r),r=this.removeUnwantedMatches(r)},e.prototype.compactMatches=function(e){e.sort((function(e,t){return e.getOffset()-t.getOffset()}));for(var t=0;t<e.length-1;t++){var s=e[t],n=s.getOffset(),r=s.getMatchedText().length,i=n+r;if(t+1<e.length){if(e[t+1].getOffset()===n){var a=e[t+1].getMatchedText().length>r?t:t+1;e.splice(a,1);continue}e[t+1].getOffset()<i&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||Ue(e,(function(e){return"hashtag"===e.getType()})),this.email||Ue(e,(function(e){return"email"===e.getType()})),this.phone||Ue(e,(function(e){return"phone"===e.getType()})),this.mention||Ue(e,(function(e){return"mention"===e.getType()})),this.urls.schemeMatches||Ue(e,(function(e){return"url"===e.getType()&&"scheme"===e.getUrlMatchType()})),this.urls.wwwMatches||Ue(e,(function(e){return"url"===e.getType()&&"www"===e.getUrlMatchType()})),this.urls.tldMatches||Ue(e,(function(e){return"url"===e.getType()&&"tld"===e.getUrlMatchType()})),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var s=this.getMatchers(),n=[],r=0,i=s.length;r<i;r++){for(var a=s[r].parseMatches(e),o=0,u=a.length;o<u;o++)a[o].setOffset(t+a[o].getOffset());n.push.apply(n,a)}return n},e.prototype.link=function(e){if(!e)return"";this.sanitizeHtml&&(e=e.replace(/</g,"<").replace(/>/g,">"));for(var t=this.parse(e),s=[],n=0,r=0,i=t.length;r<i;r++){var a=t[r];s.push(e.substring(n,a.getOffset())),s.push(this.createMatchReturnVal(a)),n=a.getOffset()+a.getMatchedText().length}return s.push(e.substring(n)),s.join("")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),"string"==typeof t?t:!1===t?e.getMatchedText():t instanceof $e?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new St({tagBuilder:e,serviceName:this.hashtag}),new bt({tagBuilder:e}),new It({tagBuilder:e}),new Bt({tagBuilder:e,serviceName:this.mention}),new Et({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new Le({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version="3.14.3",e.AnchorTagBuilder=Le,e.HtmlTag=$e,e.matcher={Email:bt,Hashtag:St,Matcher:Ze,Mention:Bt,Phone:It,Url:Et},e.match={Email:Je,Hashtag:Ve,Match:We,Mention:Ye,Phone:Ke,Url:Qe},e}();function Pt(e,t=e){return{type:"autolink",url:e,text:t}}Object.assign((function(e,t){return{type:"emoji",kind:e,text:t}}),{emoticon:e=>({type:"emoji",kind:"emoticon",text:e}),unicode:e=>({type:"emoji",kind:"unicode",text:e})});const Ut=De(/<!!mention:([^>\s]*?)\|(.*?)>/gm,(([e,t,s])=>function(e,t){return{type:"mention",id:e,text:t}}(decodeURIComponent(t),s))),jt=De(/<!!customemoji:(.*?)>/gm,(([e,t])=>function(e){return{type:"customemoji",text:e}}(t))),$t=De(/<((?:https?|mailto):.*?)\|(.*?)>/gi,(([e,t,s])=>function(e,t=[]){return{type:"link",url:e,children:t}}(t,[s]))),Lt=De(/<actionlink:([^|]+)[|]([^>]*)>/gi,(([e,t,s])=>{const{action:n,params:r}=qt(t);return function(e,t,s=[]){return{type:"actionlink",action:e,params:t,children:s}}(n,r,[s])})),Wt=De(/<actionbutton:([^|]+)[|]([^>]*)>/gi,(([e,t,s])=>{const{action:n,params:r}=qt(t);return function(e,t,s=[]){return{type:"actionbutton",action:e,params:t,children:s}}(n,r,[s])}));function qt(e){const t=e.indexOf("?");if(-1===t)return{action:e,params:{}};return{action:e.slice(0,t),params:Object.fromEntries(new URLSearchParams(e.slice(t)))}}const Gt=De(/(?:^|\n)(?:\s*[-*+]\s+[^\n]+(?:\n|$))+/gs,(([e])=>function(e=[]){return{type:"bulletlist",children:e}}([e.startsWith("\n")?e.slice(1):e]))),Ht=De(/^\s*[-*+]\s+([^\n]+)(?:\n|$)/gm,(([e,t])=>({type:"bulletpoint",children:[t]}))),zt=e=>{const t=/(?:^|[^-:/\w])([(+]?[0-9](?:[-_+ ().]?[0-9]){5,11}[0-9])(?:[^-:/\w]|$)/g;let s=0;const n=[];for(const r of ne(e,t)){const t=r[0],i=r[1],a=t.startsWith(i)?r.index:r.index+1;a-s>0&&n.push(e.substring(s,a));const o=Pt("tel:"+i.replace(/[^0-9+]/g,""),i);n.push(o),s=a+i.length}return s<e.length&&n.push(e.substring(s)),n},Jt=e=>$t(e).flatMap((e=>"string"==typeof e?Vt(e):["<",...Vt(e.url),...Vt("|"+e.children[0]+">")])),Vt=e=>{const t=Nt.parse(e,{urls:!0,email:!0,phone:!1,hashtag:!1,mention:!1}),s=[];let n=0;for(const r of t){const t=r.getOffset(),i=r.getMatchedText(),a=i.length;let o=i;r instanceof Je?o="mailto:"+r.getEmail():r instanceof Qe&&(o=r.getUrl()),t>n&&s.push(e.substring(n,t)),s.push(Pt(o,i)),n=t+a}return n<e.length&&s.push(e.substring(n)),s},Yt=["Codeblock","Codespan","FormattedLink","Wikitext","Autolink","Actions","Mention","Mention","BulletPoint","CustomEmoji"];function Kt(e={except:[]}){const t={multilineSteps:[],singlelineSteps:[]},s=e.except??Yt.filter((t=>!e.only.includes(t)));return s.includes("BulletPoint")||t.multilineSteps.push(Gt,Ht),s.includes("Mention")||t.singlelineSteps.push(Ut),s.includes("CustomEmoji")||t.singlelineSteps.push(jt),s.includes("Codespan")||t.multilineSteps.push(De(/```([^]+?)```/g,(([e,t])=>({type:"codespan",text:t})))),s.includes("FormattedLink")||t.singlelineSteps.push($t),s.includes("Actions")||(t.singlelineSteps.push(Lt),t.singlelineSteps.push(Wt)),s.includes("Wikitext")||t.singlelineSteps.push(_e),s.includes("Autolink")||t.singlelineSteps.push(Jt,zt),t}const Qt=function(e){const t=RegExp(`[^${e}]+${e}?|${e}`,"g");return e=>Array.from(e.match(t)||[])}("\n");function Zt(e,t={except:[]}){let s=function(e,t){let s=[e];return s=Xt(s,t.multilineSteps),s=Xt(s,[Qt]),s=Xt(s,t.singlelineSteps),s=es(s),s}(e,Kt(t));return s=ts(s,!1),s}function Xt(e,t){return t.reduce(((e,t)=>Ie(e,t)),e)}function es(e){const t=[];let s=-1;for(const n of e)"string"==typeof n?"string"==typeof t[s]?t[s]+=n:t[++s]=n:t[++s]="children"in n?{...n,children:es(n.children)}:n;return t}function ts(e,t){const s=[];let n=[];for(let r=0;r<e.length;r++){const i=e[r];"string"==typeof i?n.push(i):"children"in i?(n.length>0&&(s.push(n.join("")),n=[]),i.children=ts(i.children,t||"link"===i.type||"actionbutton"===i.type||"actionlink"===i.type),s.push(i)):"autolink"===i.type&&t?n.push(i.text):(n.length>0&&(s.push(n.join("")),n=[]),s.push(i))}return n.length>0&&(s.push(n.join("")),n=[]),s}class ss{constructor(e,t,s){this.id=e,this.conversationId=t,this._realtimeClient=s}get brandedId(){return this.id}get brandedConversationId(){return this.conversationId}async get(){const e=await this._realtimeClient.call("GET",["me","conversations",this.brandedConversationId,"messages",this.brandedId],{});if(!e.ok&&"server"===e.where&&404===e.value.status)return null;if(!e.ok&&"server"===e.where&&403===e.value.status&&"NOT_A_PARTICIPANT"===e.value.errorCode)return null;const s=t("Get message "+this.id,e),n=await this._realtimeClient.createMessageSnapshot(s,this.brandedConversationId);return ke("Get message "+this.id,n)}async edit(e){const s={content:ns(e),custom:"string"==typeof e?void 0:e.custom},n=await this._realtimeClient.call("PATCH",["conversations",this.brandedConversationId,"messages",this.brandedId],s);t(`Edit message ${this.id} in conversation ${this.conversationId}`,n)}async delete(){const e=await this._realtimeClient.call("DELETE",["conversations",this.brandedConversationId,"messages",this.brandedId],{});(e.ok||"server"!==e.where||404!==e.value.status)&&t(`Delete message ${this.id} in conversation ${this.conversationId}`,e)}}function ns(e){if("string"==typeof e){return[{type:"text",children:Zt(e)}]}if("text"in e&&e.text){return[{type:"text",children:Zt(e.text)}]}if("content"in e&&e.content)return e.content}class rs{constructor(e,t){this.id=e,this._realtimeClient=t}get brandedId(){return this.id}get brandedUserId(){return this._realtimeClient.userId}participant(e){return new Se("string"==typeof e?e:e.id,this.id,this._realtimeClient)}message(e){return new ss(e,this.brandedId,this._realtimeClient)}async get(){const e=this._realtimeClient.listMessages(this.brandedId,{limit:1}),s=await this._realtimeClient.call("GET",["me","conversations",this.brandedId],{});if(!s.ok&&"server"===s.where&&404===s.value.status)return null;const n=t("Get conversation "+this.id,s),r=ke("Get last message in conversation "+this.id,await e),i=0===r.length?null:r[0];return this._realtimeClient.createConversationSnapshotPreloaded(n,i)}async set(e){const s=this._realtimeClient.call("PUT",["conversations",this.brandedId],e),n=this._realtimeClient.call("PUT",["conversations",this.brandedId,"participants",this.brandedUserId],e),r=await s;!r.ok&&"server"===r.where&&403===r.value.status&&"UNAUTHORIZED_TO_EDIT"===r.value.errorCode&&function(e){if(void 0!==e.subject)return!1;if(void 0!==e.photoUrl)return!1;if(void 0!==e.welcomeMessages)return!1;if(null===e.custom)return!1;if(void 0!==e.custom&&Object.values(e.custom).some((e=>void 0!==e)))return!1;return!0}(e)||t("Set conversation "+this.id,r);const i=await n;!i.ok&&"server"===i.where&&403===i.value.status&&"UNAUTHORIZED_TO_EDIT_PARTICIPANT"===i.value.errorCode&&function(e){return void 0===e.access&&void 0===e.notify}(e)||t("Set your participation in conversation "+this.id,i)}async createIfNotExists(e={}){const s=this._realtimeClient.call("POST",["conversations",this.brandedId],e),n=this._realtimeClient.call("POST",["conversations",this.brandedId,"participants",this.brandedUserId],e),r=await s;(r.ok||"server"!==r.where||409!==r.value.status)&&t("Create conversation "+this.id,await s);const i=await n;(i.ok||"server"!==i.where||409!==i.value.status)&&t("Join conversation "+this.id,await n)}async markAsRead(){const e=await this._realtimeClient.call("POST",["me","conversations",this.brandedId,"read"],{});t(`Mark ${this.id} as read`,e)}async markAsUnread(){const e=await this._realtimeClient.call("POST",["me","conversations",this.brandedId,"unread"],{});t(`Mark ${this.id} as unread`,e)}async send(e){const s={content:is(e),referencedMessageId:as(e),custom:"string"==typeof e?void 0:e.custom,idempotencyKey:Te((new Date).getTime())},n=await this._realtimeClient.call("POST",["conversations",this.brandedId,"messages"],s),r=t("Send message to conversation "+this.id,n);return new ss("string"==typeof r?r:r.id,this.brandedId,this._realtimeClient)}subscribeMessages(e){return this._realtimeClient.subscribe(["me","conversations",this.brandedId,"messages"],e)}subscribe(e){return this._realtimeClient.subscribe(["me","conversations",this.brandedId],e)}}function is(e){if("string"==typeof e){return[{type:"text",children:Zt(e)}]}if("text"in e){return[{type:"text",children:Zt(e.text)}]}return e.content}function as(e){if("string"==typeof e)return;const t=e.referencedMessage;return void 0!==t?"string"==typeof t?t:t.id:void 0}class os{constructor(e,t,s){this.realtimeWsApiUrl=e,this.internalHttpApiUrl=t,this.restApiHttpUrl=s}getBokensUrl(e,t,s){return this.internalHttpApiUrl+`/${e}/bokens/${encodeURIComponent(t)}?signature=${encodeURIComponent(s??"")}`}getRealtimeWsUrl(e,t,s){const n=encodeURIComponent(t);return this.realtimeWsApiUrl+`/${e}/realtime/${n}?talkjs-client-build=${s??"standalone"}&talkjs-core=0.0.1`}}class us{constructor(e,t={}){this._onSubscription=t,this._handlers={};for(const t in e)Object.hasOwnProperty.call(e,t)&&(this._handlers[t]=[])}emit(e,t){for(const s of this._handlers[e])try{s(t)}catch(t){console.error(`[TalkJS] '${String(e)}' handler threw an error:`,t)}}async emitAsync(e,t){try{const s=this._handlers[e].map((e=>e(t)));await Promise.all(s)}catch(t){console.error(`[TalkJS] '${String(e)}' handler threw an error:`,t)}}supports(e){return e in this._handlers}on(e,t){if(!this.supports(e))throw new Error(`Unknown event type '${String(e)}'`);this._onSubscription[e]?.(),this._handlers[e].push(t)}off(e,t){if(!Object.hasOwnProperty.call(this._handlers,e))throw new Error(`Unknown event type '${String(e)}'`);const s=this._handlers[e].indexOf(t);-1!==s&&this._handlers[e].splice(s,1)}removeAllListeners(){for(const e in this._handlers)this._handlers[e]=[]}handles(e){return this._handlers[e].length>0}subscribe(e,t){return this.on(e,t),{unsubscribe:()=>this.off(e,t)}}}class cs{constructor(e,t,s,n,r,i){if(this.appId=t,this.userId=s,this.tokenFetcher=r,this.usingBokens=!1,this.requestInProgress=!1,this.eventEmitter=new us({tokenChanged(e){},tokenRefreshFailed(e){},tokenAccepted(e){}}),this.sessionExpiryWarningTimeoutId=void 0,i&&(n||r))throw new Error("[TalkJS] If providing a signature for authentication, you must not provide a token or tokenFetcher.");n?this.fetchToken((()=>n)):(r||(this.usingBokens=!0,this.tokenFetcher=()=>this.sendBokenRequest(e,i)),this.refreshToken())}get shouldMountFrontendWithSignature(){return this.usingBokens&&this.requestInProgress}get canRefreshToken(){return this.usingBokens||!!this.tokenFetcher}getToken(){return this.token}refreshToken(){if(!this.requestInProgress){if(!this.tokenFetcher)throw this.emitTokenRefreshFailed("no `tokenFetcher` provided"),new Error("[TalkJS] Cannot refresh token, no `tokenFetcher` provided.");this.fetchToken(this.tokenFetcher)}}onTokenChanged(e){return this.eventEmitter.on("tokenChanged",e),()=>{this.eventEmitter.off("tokenChanged",e)}}emitTokenChanged(e){this.eventEmitter.emit("tokenChanged",e)}onTokenRefreshFailed(e){return this.eventEmitter.on("tokenRefreshFailed",e),()=>{this.eventEmitter.off("tokenRefreshFailed",e)}}emitTokenRefreshFailed(e){this.eventEmitter.emit("tokenRefreshFailed",e),console.error(`[TalkJS] Server rejected authentication token, cannot recover automatically: ${e}`)}onTokenAccepted(e){return this.eventEmitter.on("tokenAccepted",e),()=>{this.eventEmitter.off("tokenAccepted",e)}}emitTokenAccepted(e){this.eventEmitter.emit("tokenAccepted",e)}scheduleRefresh(e){if(this.sessionExpiryWarningTimeoutId&&clearTimeout(this.sessionExpiryWarningTimeoutId),null===e)return;const t=void 0!==this.tokenFetcher;e<120&&!t?console.warn(`[TalkJS] TalkJS will stop working in ${e} seconds due to auth token expiry. Token expires in ${e} seconds, and cannot be refreshed because no \`tokenFetcher\` was provided when creating the session. Non-refreshable tokens are recommended to expire at least 24 hours in the future.`):e<120&&t?console.warn(`[TalkJS] TalkJS auth token will expire and need to be refreshed in ${e} seconds. Refreshable JWTs are recommended to expire at least 30 minutes in the future, to improve performance and reduce unnecessary refreshes.`):e<3300&&!t&&console.warn(`[TalkJS debug] TalkJS will stop working in ${Math.round(e/60)} minutes due to auth token expiry. Non-refreshable tokens are recommended to expire at least 24 hours in the future. Alternatively, provide a \`tokenFetcher\` when creating the session, so that tokens can be refreshed when they expire.`);if(void 0!==this.tokenFetcher){const t=e>600?e-300:e/2,s=Math.min(1728e6,1e3*t);this.sessionExpiryWarningTimeoutId=setTimeout((()=>{this.refreshToken()}),s)}else e<2e6&&(this.sessionExpiryWarningTimeoutId=setTimeout((()=>{this.emitTokenRefreshFailed("Token has expired and no `tokenFetcher` was provided when creating the session, so it cannot be refreshed.")}),1e3*e))}async fetchToken(e){if(this.requestInProgress)return;this.requestInProgress=!0;const t=e=>{if(this.usingBokens&&e instanceof Response&&401===e.status)throw"Check that you provided a valid signature";return!0},s=async()=>{const t=await e();return this.checkJwt(t),t};try{const e=void 0!==this.token;this.token=a(1e3,s,{initialDelay:.2,maxDelay:30,shouldRetry:t});const n=await this.token;e&&this.emitTokenChanged(n)}catch(e){this.emitTokenRefreshFailed(e)}finally{this.requestInProgress=!1}}checkJwt(e){const t=[];let s,n,r;if("string"==typeof e?s=e:t.push(`Token type is ${typeof e} instead of a string.`),s)try{const e=function(e){const t=e.split(".");if(3!==t.length)throw"Token does not contain exactly two `.`. Check that you generated your JWT correctly. It should be `<header>.<payload>.<signature>`.";return{header:ls(t[0]),payload:ls(t[1])}}(s);n=e.header,r=e.payload}catch(e){t.push(e)}if(n){const e=this.checkJwtHeader(n);t.push(...e)}if(r){const e=this.checkJwtPayload(r);t.push(...e)}if(t.length)if(this.usingBokens)g.log(`JWT Errors detected by AuthProvider when using bokens: ${t.join("\n")}`);else{console.warn("[TalkJS] Authentication token appears to be generated incorrectly. Will still attempt to authenticate, but TalkJS may not work as expected. See below for a description of any problems and how to fix them.");const s=t.length>1;t.forEach(((e,t)=>{const n=s?`Reason ${t+1}:`:"Reason:";console.warn(`[TalkJS] ${n} ${e}`)})),console.warn(`[TalkJS]: Authentication token: "${e}"`)}}checkJwtHeader(e){const t=[],s=e.alg;return void 0===s?t.push('Token header must contain `"alg": "HS256"`, but no `alg` was specified.'):"string"!=typeof s?t.push(`Token header must contain \`"alg": "HS256"\`, but \`alg\` was ${typeof s} instead of a string. Make sure you wrap the value in "".`):"HS256"!==s&&t.push(`Token header must contain \`"alg": "HS256"\`, but \`alg\` was set to "${s}" instead. HS256 is the only supported algorithm.`),t}checkJwtPayload(e){const t=[],s=e.iss;void 0===s?t.push(`Token payload must contain an \`iss\` claim set to your app ID (${this.appId}), but \`iss\` was missing.`):"string"!=typeof s?t.push(`Token payload must contain an \`iss\` claim set to your app ID (${this.appId}), but \`iss\` was ${typeof s} instead of a string. Make sure you wrap the value in "".`):s!==this.appId&&t.push(`Token payload must contain an \`iss\` claim set to your app ID (${this.appId}), but \`iss\` was set to "${s}" instead.`);const n=e.sub;void 0===n?t.push(`Token payload must contain a \`sub\` claim set to your user ID (${this.userId}), but \`sub\` was missing.`):"string"!=typeof n?t.push(`Token payload must contain a \`sub\` claim set to your user ID (${this.userId}), but \`sub\` was ${typeof n} instead of a string. Make sure you wrap the value in "".`):n!==this.userId&&t.push(`Token payload must contain a \`sub\` claim set to your userId ID (${this.userId}), but \`sub\` was set to "${n}" instead.`);const r=e.tokenType;void 0===r?t.push('Token payload must contain a `"tokenType": "user"` claim, but no `tokenType` was specified.'):"string"!=typeof r?t.push(`Token payload must contain a \`"tokenType": "user"\` claim, but \`tokenType\` was ${typeof r} instead of a string. Make sure you wrap the value in "".`):"user"!==r&&t.push(`Token payload must contain a \`"tokenType": "user"\` claim, but \`tokenType\` was set to "${r}" instead.`);const i=e.exp;void 0===i||("number"!=typeof i?t.push(`Token payload contains an \`exp\` claim, but \`exp\` was ${typeof r} instead of a number. If set, \`exp\` should be the expiry date as a number of seconds since 1970-01-01. Don't wrap the value in "".`):i<1e9?t.push(`Token payload contains an \`exp\` claim, but \`exp\` is very small (${i}, representing ${new Date(1e3*i).toLocaleDateString()}). If set, \`exp\` should be the expiry date as a number of seconds since 1970-01-01.`):i>1e11?t.push(`Token payload contains an \`exp\` claim, but \`exp\` is very small (${i}, representing ${new Date(1e3*i).toLocaleDateString()}). If set, \`exp\` should be the expiry date as a number of seconds since 1970-01-01. Double-check that you are using seconds and not milliseconds or nanoseconds.`):i<(new Date).getTime()/1e3&&t.push(`Token payload contains an \`exp\` claim, but \`exp\` (${i}, representing ${new Date(1e3*i).toLocaleDateString()}) appears to be in the past, meaning the token will be rejected. This error can also happen if your device's clock is set incorrectly, in which case the token will still work.`));const a=e.nbf;return void 0===a||("number"!=typeof a?t.push(`Token payload contains a \`nbf\` (not-before) claim, but \`nbf\` was ${typeof r} instead of a number. If set, \`nbf\` should be the date when the JWT becomes valid, as a number of seconds since 1970-01-01.`):a>1e11&&t.push(`Token payload contains a \`nbf\` (not-before) claim, but \`nbf\` is very large (${a}, representing ${new Date(1e3*a).toLocaleDateString()}). If set, \`nbf\` should be the date when the JWT becomes valid, as a number of seconds since 1970-01-01. Double-check that you are using seconds and not milliseconds or nanoseconds.`)),t}async sendBokenRequest(e,t){const s=e.getBokensUrl(this.appId,this.userId,t),n=await u({method:"GET",url:s,attempts:1});if(401===n.status)throw n;return(await n.json()).boken}}function ls(e){try{const t=e.replace(/-/g,"+").replace(/_/g,"/"),s=decodeURIComponent(atob(t).split("").map((e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2))).join(""));return JSON.parse(s)}catch(t){throw`Could not base64-decode and JSON-parse token section: ${e}. Check that you base-64 encoded the section correctly.`}}const hs={code:"en-US",name:"English (US)",translation:{LOCATION:"Location",VOICE_MESSAGE:"Voice message"}},ds={ar:{code:"ar",name:"Arabic",translation:{LOCATION:"الموقع",VOICE_MESSAGE:"رسالة صوتية"}},bg:{code:"bg-BG",name:"Bulgarian",translation:{LOCATION:"местоположението",VOICE_MESSAGE:"Гласово съобщение"}},bs:{code:"bs-BA",name:"Bosnian",translation:{LOCATION:"Lokacija",VOICE_MESSAGE:"Glasovna poruka"}},ca:{code:"ca-ES",name:"Catalan (ES)",translation:{LOCATION:"Ubicació",VOICE_MESSAGE:"Missatge de veu"}},cs:{code:"cs-CZ",name:"Czech",translation:{LOCATION:"Lokace",VOICE_MESSAGE:"Hlasová zpráva"}},da:{code:"da-DK",name:"Danish",translation:{LOCATION:"Placering",VOICE_MESSAGE:"Talebesked"}},de:{code:"de-DE",name:"German",translation:{LOCATION:"Standort",VOICE_MESSAGE:"Sprachnachricht"}},el:{code:"el-GR",name:"Greek (Greece)",translation:{LOCATION:"Τοποθεσία",VOICE_MESSAGE:"Ηχητικό μήνυμα"}},en:hs,es:{code:"es-ES",name:"Spanish",translation:{LOCATION:"Ubicación",VOICE_MESSAGE:"Mensaje de voz"}},et:{code:"et-EE",name:"Estonian",translation:{LOCATION:"Asukoht",VOICE_MESSAGE:"Häälsõnum"}},fa:{code:"fa",name:"Persian (Farsi)",translation:{LOCATION:"مکان",VOICE_MESSAGE:"پیام صوتی"}},fi:{code:"fi-FI",name:"Finnish",translation:{LOCATION:"Sijainti",VOICE_MESSAGE:"Ääniviesti"}},fr:{code:"fr-FR",name:"French",translation:{LOCATION:"Emplacement",VOICE_MESSAGE:"Message vocal"}},he:{code:"he-IL",name:"Hebrew",translation:{LOCATION:"מיקום",VOICE_MESSAGE:"הודעה קולית"}},hi:{code:"hi-IN",name:"Hindi (IN)",translation:{LOCATION:"जगह",VOICE_MESSAGE:"वॉयस मैसेज"}},hr:{code:"hr-HR",name:"Croatian",translation:{LOCATION:"Lokacija",VOICE_MESSAGE:"Glasovna poruka"}},hu:{code:"hu-HU",name:"Hungarian",translation:{LOCATION:"Helyszín",VOICE_MESSAGE:"Hangüzenet"}},id:{code:"id-ID",name:"Bahasa Indonesia",translation:{LOCATION:"Lokasi",VOICE_MESSAGE:"Pesan suara"}},it:{code:"it-IT",name:"Italian",translation:{LOCATION:"Posizione",VOICE_MESSAGE:"Messaggio vocale"}},ja:{code:"ja-JP",name:"Japanese",translation:{LOCATION:"場所",VOICE_MESSAGE:"ボイスメッセージ"}},ka:{code:"ka-GE",name:"Georgian",translation:{LOCATION:"ადგილმდებარეობა",VOICE_MESSAGE:"ხმოვანი შეტყობინება"}},ko:{code:"ko-KR",name:"Korean (South Korea)",translation:{LOCATION:"위치",VOICE_MESSAGE:"음성 메시지"}},nb:{code:"nb-NO",name:"Norwegian (Bokmål)",translation:{LOCATION:"Plassering",VOICE_MESSAGE:"Lydmelding"}},nl:{code:"nl-NL",name:"Dutch",translation:{LOCATION:"Locatie",VOICE_MESSAGE:"Spraakbericht"}},pl:{code:"pl-PL",name:"Polish",translation:{LOCATION:"Lokalizacja",VOICE_MESSAGE:"Wiadomość głosowa"}},pt:{code:"pt-BR",name:"Portuguese (Brazil)",translation:{LOCATION:"Localização",VOICE_MESSAGE:"Mensagem de voz"}},ro:{code:"ro-RO",name:"Romanian (Romania)",translation:{LOCATION:"Locație",VOICE_MESSAGE:"Mesaj vocal"}},ru:{code:"ru-RU",name:"Russian",translation:{LOCATION:"Местоположение",VOICE_MESSAGE:"Голосовое сообщение"}},sq:{code:"sq-AL",name:"Albanian",translation:{LOCATION:"Pozicion",VOICE_MESSAGE:"Mesazh zanor"}},sr:{code:"sr-SP",name:"Serbian",translation:{LOCATION:"Lokacija",VOICE_MESSAGE:"Glasovna poruka"}},sv:{code:"sv-SE",name:"Swedish (Sweden)",translation:{LOCATION:"Plats",VOICE_MESSAGE:"Röstmeddelande"}},tr:{code:"tr-TR",name:"Turkish",translation:{LOCATION:"Konum",VOICE_MESSAGE:"Sesli mesaj"}},uk:{code:"uk-UA",name:"Ukrainian (Ukraine)",translation:{LOCATION:"Місцезнаходження",VOICE_MESSAGE:"Голосове повідомлення"}},vi:{code:"vi-VN",name:"Vietnamese",translation:{LOCATION:"Địa điểm",VOICE_MESSAGE:"Tin nhắn thoại"}},zh:{code:"zh-CN",name:"Chinese (Simplified)",translation:{LOCATION:"地点",VOICE_MESSAGE:"语音消息"}},zhTw:{code:"zh-TW",name:"Chinese (Traditional)",translation:{LOCATION:"地點",VOICE_MESSAGE:"語音訊息"}}};const ps=new os("wss://realtime.talkjs.com/v1","https://app.talkjs.com/api/v0","https://api.talkjs.com/v1");class fs{constructor(e){this._userLocale=null,this._appLocale=null,function(e){function t(e,t){if(!e)throw new Error("[TalkJS] TalkSession: "+t)}t(e&&"object"==typeof e,"Expected an object argument in TalkSession#constructor."),t(e.appId&&"string"==typeof e.appId,"The `appId` property of TalkSession#constructor is required and it must be a non-empty string."),t("string"==typeof e.userId,"The `userId` property of TalkSession#constructor is required and it must be a string."),void 0!==e.token&&t(e.token&&"string"==typeof e.token,"The `token` property of TalkSession#constructor must be a non-empty string.");void 0!==e.tokenFetcher&&t("function"==typeof e.tokenFetcher,"The `tokenFetcher` property of TalkSession#constructor must be a function.");void 0!==e.onError&&t("function"==typeof e.onError,"The `onError` property of TalkSession#constructor must be a function.")}(e);const{appId:t,userId:s,token:n,tokenFetcher:r}=e;this._appId=t,this._apiUrls=e.apiUrls?new os(e.apiUrls.realtimeWsApiUrl,e.apiUrls.internalHttpApiUrl,e.apiUrls.restApiHttpUrl):ps,this._authProvider=new cs(this._apiUrls,t,s,n,r);this._realtimeClient=new Ce(this._apiUrls.getRealtimeWsUrl(t,s,e.clientBuild),t,s,this._authProvider,{t:(e,t)=>{const s=function(e){const t=e.replace(/_/g,"-").toLowerCase(),s=ds[t];if(s)return s.translation;const n=t.slice(0,2),r=ds[n];return r?r.translation:(console.warn(`[TalkJS] User locale '${e}' not supported; falling back to English.`),hs.translation)}(this._userLocale??this._appLocale??"en-US")[e];return"function"==typeof s?s(t):s}}),this.currentUser=new xe(this._realtimeClient.userId,this._realtimeClient),this.currentUser.get().then((async e=>{e&&(this._userLocale=e.locale);const s=this._apiUrls.internalHttpApiUrl+`/${t}/app`,n=await u({method:"GET",url:s,attempts:1,authProvider:this._authProvider});if(n.ok){const e=await n.json();this._appLocale=e.appMetadata.defaultLocale}})).catch((()=>{})),this._terminationReason=o(),this._terminationReason.promise.then((t=>{if(!t.wasClean){(e.onError??console.error)(t.error)}})),async function(e,t,s){return u({method:"GET",url:`${t}/${e}/app`,authProvider:s}).then((e=>200===e.status||404!==e.status&&(console.warn(`[TalkJS] Received unexpected ${e.status} status code when validating app ID. Assuming that the app ID is valid.`),!0))).catch((e=>{if("string"!=typeof e&&"status"in e){const t=e;return 200===t.status||404!==t.status&&(console.warn(`[TalkJS] Received unexpected ${t.status} status code when validating app ID. Assuming that the app ID is valid.`),!0)}return console.warn("[TalkJS] Encountered network issues when validating app ID. Assuming that the app ID is valid."),!0}))}(this._appId,this._apiUrls.internalHttpApiUrl,this._authProvider).then((e=>{e||this.terminate({wasClean:!1,error:new Error(`[TalkJS] The app ID ${this._appId} does not exist. Make sure you are using the correct app ID as found on the TalkJS dashboard. App IDs are case-sensitive.`)})})),this._authProvider.onTokenRefreshFailed((e=>{this.terminate({wasClean:!1,error:new Error(`[TalkJS] Server rejected authentication token, cannot recover automatically: ${e}`)})}))}user(e){return new xe(e,this._realtimeClient)}conversation(e){return new rs(e,this._realtimeClient)}destroy(){this.terminate({wasClean:!0})}terminate(e){this._terminationReason.resolve(e),this._realtimeClient.destroy()}_isConnected(){return this._realtimeClient.isConnected()}uploadFile(e,t){return ms(`${this._apiUrls.restApiHttpUrl}/${this._appId}/files`,this._authProvider,e,t)}uploadImage(e,t){return ms(`${this._apiUrls.restApiHttpUrl}/${this._appId}/files`,this._authProvider,e,{subtype:"image",...t})}uploadVideo(e,t){return ms(`${this._apiUrls.restApiHttpUrl}/${this._appId}/files`,this._authProvider,e,{subtype:"video",...t})}uploadAudio(e,t){return ms(`${this._apiUrls.restApiHttpUrl}/${this._appId}/files`,this._authProvider,e,{subtype:"audio",...t})}uploadVoice(e,t){return ms(`${this._apiUrls.restApiHttpUrl}/${this._appId}/files`,this._authProvider,e,{subtype:"voice",...t})}}function ms(e,t,s,{subtype:n,filename:r,width:i,height:a,duration:o}){const c=new FormData;return c.set("file",s,r),void 0!==n&&c.set("subtype",n),void 0!==i&&c.set("width",i.toString()),void 0!==a&&c.set("height",a.toString()),void 0!==o&&c.set("duration",o.toString()),u({method:"POST",url:e,data:c,authProvider:t}).then((e=>e.json())).then((e=>e.attachmentToken))}export{fs as TalkSession,E as registerPolyfills};
|
|
2
|
+
//# sourceMappingURL=talkSession.js.map
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@talkjs/core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Lets you connect to your TalkJS chat as a user and read, subscribe to, and update your chat data.",
|
|
5
|
+
"bugs": {
|
|
6
|
+
"url": "https://talkjs.com/?chat"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://talkjs.com",
|
|
9
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
10
|
+
"type": "module",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/talkSession.js",
|
|
13
|
+
"dist/talkSession.d.ts",
|
|
14
|
+
"LICENSE.md"
|
|
15
|
+
],
|
|
16
|
+
"main": "./dist/talkSession.js",
|
|
17
|
+
"module": "./dist/talkSession.js",
|
|
18
|
+
"types": "./dist/talkSession.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/talkSession.d.ts",
|
|
22
|
+
"import": "./dist/talkSession.js",
|
|
23
|
+
"require": null
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"typecheck": "tsc",
|
|
28
|
+
"lint": "eslint --max-warnings=0",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:ci": "vitest run --mode production",
|
|
31
|
+
"test:watch": "vitest",
|
|
32
|
+
"check": "npm run typecheck && npm run lint && npm run test && npm run build",
|
|
33
|
+
"build": "vite build"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@eslint/js": "^9.21.0",
|
|
37
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
38
|
+
"@types/ws": "^8.18.0",
|
|
39
|
+
"eslint": "^9.21.0",
|
|
40
|
+
"globals": "^16.0.0",
|
|
41
|
+
"terser": "^5.39.0",
|
|
42
|
+
"typescript": "^5.8.2",
|
|
43
|
+
"typescript-eslint": "^8.26.0",
|
|
44
|
+
"vite": "^6.2.0",
|
|
45
|
+
"vite-plugin-dts": "^3.7.3",
|
|
46
|
+
"vite-plugin-externalize-deps": "^0.9.0",
|
|
47
|
+
"vitest": "^3.0.8",
|
|
48
|
+
"ws": "^8.18.1"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"chat",
|
|
52
|
+
"chat api",
|
|
53
|
+
"chat sdk",
|
|
54
|
+
"messaging",
|
|
55
|
+
"talk",
|
|
56
|
+
"talkjs",
|
|
57
|
+
"realtime",
|
|
58
|
+
"real-time messaging",
|
|
59
|
+
"real-time chat",
|
|
60
|
+
"direct messaging",
|
|
61
|
+
"user-to-user chat",
|
|
62
|
+
"private messaging",
|
|
63
|
+
"group chat",
|
|
64
|
+
"dm",
|
|
65
|
+
"pm",
|
|
66
|
+
"notification",
|
|
67
|
+
"notifications"
|
|
68
|
+
]
|
|
69
|
+
}
|