pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
3 lines (2 loc) • 24 kB
JavaScript
!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){"use strict";function e(e,t,n,r){return new(n||(n=Promise))((function(i,s){function o(e){try{l(r.next(e))}catch(e){s(e)}}function c(e){try{l(r.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,c)}l((r=r.apply(e,t||[])).next())}))}var t;"function"==typeof SuppressedError&&SuppressedError,function(e){e.GET="GET",e.POST="POST",e.PATCH="PATCH",e.DELETE="DELETE",e.LOCAL="LOCAL"}(t||(t={}));"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var r,i,s={exports:{}};
/*! lil-uuid - v0.1 - MIT License - https://github.com/lil-js/uuid */r=s,function(e){var t="0.1.0",n={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i};function r(){var e,t,n="";for(e=0;e<32;e++)t=16*Math.random()|0,8!==e&&12!==e&&16!==e&&20!==e||(n+="-"),n+=(12===e?4:16===e?3&t|8:t).toString(16);return n}function i(e,t){var r=n[t||"all"];return r&&r.test(e)||!1}r.isUUID=i,r.VERSION=t,e.uuid=r,e.isUUID=i}(i=s.exports),null!==r&&(r.exports=i.uuid);var o=n(s.exports),c={createUUID:()=>o.uuid?o.uuid():o()};const l=new Map,u={},a=c.createUUID(),d=new Map,f={},h={},p={},b={},g={},v={};self.onconnect=e=>{ie("New PubNub Client connected to the Subscription Shared Worker."),e.ports.forEach((e=>{e.start(),e.onmessage=t=>{if(!J(t))return;const n=t.data;if("client-register"===n.type)n.port=e,x(n),ie(`Client '${n.clientIdentifier}' registered with '${a}' shared worker`);else if("client-unregister"===n.type)F(n);else if("client-pong"===n.type)M(n);else if("send-request"===n.type)if(n.request.path.startsWith("/v2/subscribe")){U(n);const e=f[n.clientIdentifier];if(e){const t=re(e);let r=[];if(l.has(t)&&(r=l.get(t)[0]),r.push([e,n]),!l.has(t)){const e=setTimeout((()=>{y(r,n),l.delete(t)}),50);l.set(t,[r,e])}}}else n.request.path.endsWith("/heartbeat")?(D(n),m(n)):$(n);else"cancel-request"===n.type&&k(n)},e.postMessage({type:"shared-worker-connected"})}))};const y=(e,t)=>{const n=K(t),r=f[t.clientIdentifier];r&&(e=e.filter((e=>e[0].clientIdentifier!==r.clientIdentifier)),I(r,t,n,!0),e.forEach((([e,t])=>I(e,t,n,!1))))},I=(e,t,n,r)=>{var i;let s=!1;if(r||"string"==typeof n||(n=n.identifier),e.subscription&&(s="0"===e.subscription.timetoken),"string"==typeof n){const r=v[n];if(e){if(e.subscription&&(e.subscription.timetoken=r.timetoken,e.subscription.region=r.region,e.subscription.serviceRequestId=n),!s)return;const o=(new TextEncoder).encode(`{"t":{"t":"${r.timetoken}","r":${null!==(i=r.region)&&void 0!==i?i:"0"}},"m":[]}`),c=new Headers({"Content-Type":'text/javascript; charset="UTF-8"',"Content-Length":`${o.length}`}),l=new Response(o,{status:200,headers:c}),u=W([l,o]);u.url=`${t.request.origin}${t.request.path}`,u.clientIdentifier=t.clientIdentifier,u.identifier=t.request.identifier,R(e,u)}return}t.request.cancellable&&d.set(n.identifier,new AbortController);const o=v[n.identifier],{timetokenOverride:c,regionOverride:l}=o;j(n,(()=>E(n.identifier)),((e,r)=>{A(e,r,t.request),S(e,n.identifier)}),((e,r)=>{A(e,null,t.request,L(r)),S(e,n.identifier)}),(e=>{let t=e;return s&&c&&"0"!==c&&(t=q(t,c,l)),t})),ie(`'${Object.keys(v).length}' subscription request currently active.`)},q=(e,t,n)=>{if(void 0===t||"0"===t||e[0].status>=400)return e;let r;const i=e[0];let s=i,o=e[1];try{r=JSON.parse((new TextDecoder).decode(o))}catch(t){return ie(`Subscribe response parse error: ${t}`),e}r.t.t=t,n&&(r.t.r=parseInt(n,10));try{if(o=(new TextEncoder).encode(JSON.stringify(r)).buffer,o.byteLength){const e=new Headers(i.headers);e.set("Content-Length",`${o.byteLength}`),s=new Response(o,{status:i.status,statusText:i.statusText,headers:e})}}catch(t){return ie(`Subscribe serialization error: ${t}`),e}return o.byteLength>0?[s,o]:e},m=e=>{var t;const n=f[e.clientIdentifier],r=G(e);if(!n)return;const i=`${n.userId}_${null!==(t=te(n))&&void 0!==t?t:""}`,s=p[n.subscriptionKey],o=(null!=s?s:{})[i];if(!r){let t,r;if(ie(`Previous heartbeat request has been sent less than ${n.heartbeatInterval} seconds ago. Skipping...`,n),o&&o.response&&([t,r]=o.response),!t){r=(new TextEncoder).encode('{ "status": 200, "message": "OK", "service": "Presence" }').buffer;const e=new Headers({"Content-Type":'text/javascript; charset="UTF-8"',"Content-Length":`${r.byteLength}`});t=new Response(r,{status:200,headers:e})}const i=W([t,r]);return i.url=`${e.request.origin}${e.request.path}`,i.clientIdentifier=e.clientIdentifier,i.identifier=e.request.identifier,void R(n,i)}j(r,(()=>[n]),((t,n)=>{o&&(o.response=n),A(t,n,e.request)}),((t,n)=>{A(t,null,e.request,L(n))})),ie("Started heartbeat request.",n)},$=(e,t,n)=>{var r,i,s;const o=null!=t?t:f[e.clientIdentifier],c=C(e,t);if(!o)return;const{subscription:l,heartbeat:u}=o,a=null!=n?n:null==l?void 0:l.serviceRequestId;if(l&&0===l.channels.length&&0===l.channelGroups.length&&(l.channelGroupQuery="",l.path="",l.previousTimetoken="0",l.timetoken="0",delete l.region,delete l.serviceRequestId,delete l.request),p[o.subscriptionKey]&&u&&0===u.channels.length&&0===u.channelGroups.length){const e=null!==(r=p[s=o.subscriptionKey])&&void 0!==r?r:p[s]={},t=`${o.userId}_${null!==(i=te(o))&&void 0!==i?i:""}`;e[t]&&e[t].clientIdentifier===o.clientIdentifier&&delete e[t].clientIdentifier}if(!c){const t=(new TextEncoder).encode('{"status": 200, "action": "leave", "message": "OK", "service":"Presence"}'),n=new Headers({"Content-Type":'text/javascript; charset="UTF-8"',"Content-Length":`${t.length}`}),r=new Response(t,{status:200,headers:n}),i=W([r,t]);return i.url=`${e.request.origin}${e.request.path}`,i.clientIdentifier=e.clientIdentifier,i.identifier=e.request.identifier,void R(o,i)}if(j(c,(()=>[o]),((t,n)=>{A(t,n,e.request)}),((t,n)=>{A(t,null,e.request,L(n))})),ie("Started leave request.",o),void 0===a)return;const d=E(a);d.forEach((e=>{e&&e.subscription&&delete e.subscription.serviceRequestId})),O(a),w(d)},k=e=>{const t=f[e.clientIdentifier];if(!t||!t.subscription)return;const n=t.subscription.serviceRequestId;t&&n&&(delete t.subscription.serviceRequestId,t.subscription.request&&t.subscription.request.identifier===e.identifier&&delete t.subscription.request,O(n))},w=e=>{let t,n;for(const r of e)if(r.subscription&&r.subscription.request){n=r.subscription.request,t=r;break}if(!n||!t)return;const r={type:"send-request",clientIdentifier:t.clientIdentifier,subscriptionKey:t.subscriptionKey,request:n};y([[t,r]],r)},j=(t,n,r,i,s)=>{e(void 0,void 0,void 0,(function*(){var e;Promise.race([fetch(T(t),{signal:null===(e=d.get(t.identifier))||void 0===e?void 0:e.signal,keepalive:!0}),P(t.identifier,t.timeout)]).then((e=>e.arrayBuffer().then((t=>[e,t])))).then((e=>s?s(e):e)).then((e=>{const t=n();0!==t.length&&r(t,e)})).catch((e=>{const t=n();if(0===t.length)return;let r=e;if("string"==typeof e){const t=e.toLowerCase();r=new Error(e),!t.includes("timeout")&&t.includes("cancel")&&(r.name="AbortError")}i(t,r)}))}))},O=e=>{if(0===E(e).length){const t=d.get(e);d.delete(e),delete v[e],t&&t.abort("Cancel request")}},P=(e,t)=>new Promise(((n,r)=>{const i=setTimeout((()=>{d.delete(e),clearTimeout(i),r(new Error("Request timeout"))}),1e3*t)})),E=e=>Object.values(f).filter((t=>void 0!==t&&void 0!==t.subscription&&t.subscription.serviceRequestId===e)),S=(e,t)=>{delete v[t],e.forEach((e=>{e.subscription&&(delete e.subscription.request,delete e.subscription.serviceRequestId)}))},T=e=>{let t;const n=e.queryParameters;let r=e.path;if(e.headers){t={};for(const[n,r]of Object.entries(e.headers))t[n]=r}return n&&0!==Object.keys(n).length&&(r=`${r}?${oe(n)}`),new Request(`${e.origin}${r}`,{method:e.method,headers:t,redirect:"follow"})},K=e=>{var t,n,r,i,s;const o=f[e.clientIdentifier],l=o.subscription,u=Q(l.timetoken,e),a=c.createUUID(),d=Object.assign({},e.request);let h,p;if(u.length>1){const s=H(u,e);if(s){const e=v[s],{channels:n,channelGroups:r}=null!==(t=o.subscription)&&void 0!==t?t:{channels:[],channelGroups:[]};if((!(n.length>0)||Z(e.channels,n))&&(!(r.length>0)||Z(e.channelGroups,r)))return s}const c=(null!==(n=b[o.subscriptionKey])&&void 0!==n?n:{})[o.userId],f={},g=new Set(l.channelGroups),y=new Set(l.channels);c&&l.objectsWithState.length&&l.objectsWithState.forEach((e=>{const t=c[e];t&&(f[e]=t)}));for(const e of u){const{subscription:t}=e;if(!t)continue;1!==u.length&&e.clientIdentifier===o.clientIdentifier||!t.timetoken||(h=t.timetoken,p=t.region),t.channelGroups.forEach(g.add,g),t.channels.forEach(y.add,y);const n=t.serviceRequestId;t.serviceRequestId=a,n&&v[n]&&O(n),c&&t.objectsWithState.forEach((e=>{const t=c[e];t&&!f[e]&&(f[e]=t)}))}const I=null!==(r=v[a])&&void 0!==r?r:v[a]={requestId:a,timetoken:null!==(i=d.queryParameters.tt)&&void 0!==i?i:"0",channelGroups:[],channels:[]};if(y.size){I.channels=Array.from(y).sort();const e=d.path.split("/");e[4]=I.channels.join(","),d.path=e.join("/")}if(g.size&&(I.channelGroups=Array.from(g).sort(),d.queryParameters["channel-group"]=I.channelGroups.join(",")),Object.keys(f).length&&(d.queryParameters.state=JSON.stringify(f)),d.queryParameters&&d.queryParameters.auth){const e=ne(u);e&&(d.queryParameters.auth=e)}}else v[a]={requestId:a,timetoken:null!==(s=d.queryParameters.tt)&&void 0!==s?s:"0",channelGroups:l.channelGroups,channels:l.channels};v[a]&&(d.queryParameters&&void 0!==d.queryParameters.tt&&void 0!==d.queryParameters.tr&&(v[a].region=d.queryParameters.tr),v[a].timetokenOverride=h,v[a].regionOverride=p),l.serviceRequestId=a,d.identifier=a;const g=u.reduce(((e,{clientIdentifier:t})=>(e.push(t),e)),[]).join(", ");if(g.length>0)for(const e of u)se(v[a],`Started aggregated request for clients: ${g}`,e);return d},G=e=>{var t,n,r,i,s;const o=f[e.clientIdentifier],c=B(e),l=Object.assign({},e.request);if(!o||!o.heartbeat)return;const u=null!==(t=p[s=o.subscriptionKey])&&void 0!==t?t:p[s]={},a=`${o.userId}_${null!==(n=te(o))&&void 0!==n?n:""}`,d=[...o.heartbeat.channelGroups],h=[...o.heartbeat.channels];let b,g,v=!1;if(u[a]){const{channels:e,channelGroups:t,response:n}=u[a];b=null!==(i=o.heartbeat.presenceState)&&void 0!==i?i:{},g=Z(e,h)&&Z(t,d),n&&(v=n[0].status>=400)}else u[a]={channels:h,channelGroups:d,clientIdentifier:o.clientIdentifier,timestamp:Date.now()},b=null!==(r=o.heartbeat.presenceState)&&void 0!==r?r:{},g=!1;let y=o.heartbeatInterval;for(const e of c)e.heartbeatInterval&&(y=Math.min(y,e.heartbeatInterval));if(g&&u[a].clientIdentifier){const e=u[a].timestamp+1e3*y,t=Date.now();if(!v&&t<e&&e-t>.05*y*1e3)return}delete u[a].response,u[a].clientIdentifier=o.clientIdentifier;for(const t of c){const{heartbeat:n}=t;void 0!==n&&t.clientIdentifier!==e.clientIdentifier&&(n.presenceState&&(b=Object.assign(Object.assign({},b),n.presenceState)),d.push(...n.channelGroups.filter((e=>!d.includes(e)))),h.push(...n.channels.filter((e=>!h.includes(e)))))}u[a].channels=h,u[a].channelGroups=d,u[a].timestamp=Date.now();for(const e in Object.keys(b))h.includes(e)||d.includes(e)||delete b[e];if(0!==h.length||0!==d.length){if(h.length||d.length){const e=l.path.split("/");e[6]=h.length?h.join(","):",",l.path=e.join("/")}if(d.length&&(l.queryParameters["channel-group"]=d.join(",")),Object.keys(b).length?l.queryParameters.state=JSON.stringify(b):delete l.queryParameters.state,c.length>1&&l.queryParameters&&l.queryParameters.auth){const e=ne(c);e&&(l.queryParameters.auth=e)}return l}},C=(e,t)=>{var n;const r=null!=t?t:f[e.clientIdentifier],i=z(e,t);let s=Y(e.request),o=X(e.request);const c=Object.assign({},e.request);if(r&&r.subscription){const{subscription:e}=r;o.length&&(e.channels=e.channels.filter((e=>!o.includes(e)))),s.length&&(e.channelGroups=e.channelGroups.filter((e=>!s.includes(e))))}if(r&&r.heartbeat){const{heartbeat:e}=r;o.length&&(e.channels=e.channels.filter((e=>!o.includes(e)))),s.length&&(e.channelGroups=e.channelGroups.filter((e=>!s.includes(e))))}for(const t of i){const n=t.subscription;void 0!==n&&(t.clientIdentifier!==e.clientIdentifier&&(o.length&&(o=o.filter((e=>!e.endsWith("-pnpres")&&!n.channels.includes(e)))),s.length&&(s=s.filter((e=>!e.endsWith("-pnpres")&&!n.channelGroups.includes(e))))))}if(o.length&&(o=o.filter((e=>!e.endsWith("-pnpres")))),s.length&&(s=s.filter((e=>!e.endsWith("-pnpres")))),0!==o.length||0!==s.length){if(r&&p[r.subscriptionKey]&&(o.length||s.length)){const e=p[r.subscriptionKey],t=`${r.userId}_${null!==(n=te(r))&&void 0!==n?n:""}`;if(e[t]){let{channels:n,channelGroups:r}=e[t];s.length&&(r=r.filter((e=>!o.includes(e)))),o.length&&(n=n.filter((e=>!o.includes(e)))),e[t].channelGroups=r,e[t].channels=n}}if(o.length){const e=c.path.split("/");e[6]=o.join(","),c.path=e.join("/")}if(s.length&&(c.queryParameters["channel-group"]=s.join(",")),i.length>1&&c.queryParameters&&c.queryParameters.auth){const e=ne(i);e&&(c.queryParameters.auth=e)}return c}if(r&&r.workerLogVerbosity){const e=i.reduce(((e,{clientIdentifier:t})=>(e.push(t),e)),[]).join(", ");ie(`Specified channels and groups still in use by other clients: ${e}. Ignoring leave request.`,r)}},R=(e,t)=>{var n;const r=(null!==(n=g[e.subscriptionKey])&&void 0!==n?n:{})[e.clientIdentifier];if(!r)return!1;try{return r.postMessage(t),!0}catch(t){e.workerLogVerbosity&&console.error(`[SharedWorker] Unable send message using message port: ${t}`)}return!1},A=(e,t,n,r)=>{var i,s;if(0===e.length)return;if(!r&&!t)return;const o=e.some((e=>e&&e.workerLogVerbosity)),c=null!==(i=g[e[0].subscriptionKey])&&void 0!==i?i:{},l=n&&n.path.startsWith("/v2/subscribe");if(!r&&t&&(r=t[0].status>=400?L(void 0,t):W(t)),o&&n&&!n.path.endsWith("/heartbeat")){const t=`Notify clients about ${l?"subscribe":"leave"} request completion: ${e.reduce(((e,{clientIdentifier:t})=>(e.push(t),e)),[]).join(", ")}`;for(const n of e)ie(t,n)}for(const t of e){if(l&&!t.subscription){if(o){const n=`${t.clientIdentifier} doesn't have active subscription. Don't notify about completion.`;for(const t of e)ie(n,t)}continue}const i=c[t.clientIdentifier],{request:u}=null!==(s=t.subscription)&&void 0!==s?s:{};let a=null!=u?u:n;if(l||(a=n),i&&a){const e=Object.assign(Object.assign({},r),{clientIdentifier:t.clientIdentifier,identifier:a.identifier,url:`${a.origin}${a.path}`});R(t,e)}else if(!i&&o){const n=`${t.clientIdentifier} doesn't have Shared Worker's communication channel. Don't notify about completion.`;for(const r of e)r.clientIdentifier!==t.clientIdentifier&&ie(n,r)}}},W=e=>{var t;const[n,r]=e,i=r.byteLength>0?r:void 0,s=parseInt(null!==(t=n.headers.get("Content-Length"))&&void 0!==t?t:"0",10),o=n.headers.get("Content-Type"),c={};return n.headers.forEach(((e,t)=>c[t]=e.toLowerCase())),{type:"request-process-success",clientIdentifier:"",identifier:"",url:"",response:{contentLength:s,contentType:o,headers:c,status:n.status,body:i}}},L=(e,t)=>{if(t)return Object.assign(Object.assign({},W(t)),{type:"request-process-error"});let n="NETWORK_ISSUE",r="Unknown error",i="Error";e&&e instanceof Error&&(r=e.message,i=e.name);const s=r.toLowerCase();return s.includes("timeout")?n="TIMEOUT":("AbortError"===i||s.includes("aborted")||s.includes("cancel"))&&(r="Request aborted",n="ABORTED"),{type:"request-process-error",clientIdentifier:"",identifier:"",url:"",error:{name:i,type:n,message:r}}},x=e=>{var t,n,r,i,s;const{clientIdentifier:o}=e;if(f[o])return;const c=f[o]={clientIdentifier:o,subscriptionKey:e.subscriptionKey,userId:e.userId,heartbeatInterval:e.heartbeatInterval,newlyRegistered:!0,offlineClientsCheckInterval:e.workerOfflineClientsCheckInterval,unsubscribeOfflineClients:e.workerUnsubscribeOfflineClients,workerLogVerbosity:e.workerLogVerbosity},l=null!==(t=h[i=e.subscriptionKey])&&void 0!==t?t:h[i]=[];l.every((e=>e.clientIdentifier!==o))&&l.push(c),(null!==(n=g[s=e.subscriptionKey])&&void 0!==n?n:g[s]={})[o]=e.port;const a=`Registered PubNub client with '${o}' identifier. '${l.length}' clients currently active.`;for(const e of l)ie(a,e);if(!u[e.subscriptionKey]&&(null!==(r=h[e.subscriptionKey])&&void 0!==r?r:[]).length>0){const{subscriptionKey:t}=e,n=e.workerOfflineClientsCheckInterval;for(const e of l)ie(`Setup PubNub client ping event ${n} seconds`,e);u[t]=setTimeout((()=>ee(t)),500*n-1)}},F=e=>{_(e.subscriptionKey,e.clientIdentifier)},U=e=>{var t,n,r,i,s,o,c,l,u,a,d,h,p,g,v,y,I,q,m,$;const k=e.request.queryParameters,{clientIdentifier:w}=e,j=f[w];if(!j)return;const O=null!==(t=k["channel-group"])&&void 0!==t?t:"",P=null!==(n=k.state)&&void 0!==n?n:"";let E=j.subscription;if(E){if(P.length>0){const e=JSON.parse(P),t=null!==(o=(y=null!==(s=b[v=j.subscriptionKey])&&void 0!==s?s:b[v]={})[I=j.userId])&&void 0!==o?o:y[I]={};Object.entries(e).forEach((([e,n])=>t[e]=n));for(const n of E.objectsWithState)e[n]||delete t[n];E.objectsWithState=Object.keys(e)}else if(E.objectsWithState.length){const e=null!==(l=(m=null!==(c=b[q=j.subscriptionKey])&&void 0!==c?c:b[q]={})[$=j.userId])&&void 0!==l?l:m[$]={};for(const t of E.objectsWithState)delete e[t];E.objectsWithState=[]}}else{if(E={path:"",channelGroupQuery:"",channels:[],channelGroups:[],previousTimetoken:"0",timetoken:"0",objectsWithState:[]},P.length>0){const e=JSON.parse(P),t=null!==(i=(p=null!==(r=b[h=j.subscriptionKey])&&void 0!==r?r:b[h]={})[g=j.userId])&&void 0!==i?i:p[g]={};Object.entries(e).forEach((([e,n])=>t[e]=n)),E.objectsWithState=Object.keys(e)}j.subscription=E}E.path!==e.request.path&&(E.path=e.request.path,E.channels=X(e.request)),E.channelGroupQuery!==O&&(E.channelGroupQuery=O,E.channelGroups=Y(e.request));let{authKey:S}=j;const{userId:T}=j;E.request=e.request,E.filterExpression=null!==(u=k["filter-expr"])&&void 0!==u?u:"",E.timetoken=null!==(a=k.tt)&&void 0!==a?a:"0",void 0!==k.tr&&(E.region=k.tr),j.authKey=null!==(d=k.auth)&&void 0!==d?d:"",j.origin=e.request.origin,j.userId=k.uuid,j.pnsdk=k.pnsdk,j.accessToken=e.token,j.newlyRegistered&&!S&&j.authKey&&(S=j.authKey),j.newlyRegistered=!1,N(j,T,S)},D=e=>{var t,n;const r=f[e.clientIdentifier],{request:i}=e;if(!r)return;const s=null!==(t=r.heartbeat)&&void 0!==t?t:r.heartbeat={channels:[],channelGroups:[]};s.channelGroups=Y(i).filter((e=>!e.endsWith("-pnpres"))),s.channels=X(i).filter((e=>!e.endsWith("-pnpres")));const o=null!==(n=i.queryParameters.state)&&void 0!==n?n:"";if(o.length>0){const e=JSON.parse(o);for(const t of Object.keys(e))s.channels.includes(t)||s.channelGroups.includes(t)||delete e[t];s.presenceState=e}},N=(e,t,n)=>{var r,i,s;if(!e||t===e.userId&&(null!=n?n:"")===(null!==(r=e.authKey)&&void 0!==r?r:""))return;const o=null!==(i=p[e.subscriptionKey])&&void 0!==i?i:{},c=`${t}_${null!==(s=te(e))&&void 0!==s?s:""}`;void 0!==o[c]&&delete o[c]},M=e=>{const t=f[e.clientIdentifier];t&&(t.lastPongEvent=(new Date).getTime()/1e3)},_=(e,t)=>{var n,r,i;const s=f[t];delete f[t];let o,c=h[e];if(s){if(s.subscription&&(o=s.subscription.serviceRequestId,delete s.subscription.serviceRequestId,o&&O(o)),p[e]){const t=null!==(n=p[e])&&void 0!==n?n:p[e]={},i=`${s.userId}_${null!==(r=te(s))&&void 0!==r?r:""}`;t[i]&&t[i].clientIdentifier===s.clientIdentifier&&delete t[i].clientIdentifier}s.unsubscribeOfflineClients&&V(s,o)}if(c)if(c=c.filter((e=>e.clientIdentifier!==t)),c.length>0?h[e]=c:(delete h[e],delete p[e]),0===c.length&&delete b[e],c.length>0){const n=g[e];n&&(delete n[t],0===Object.keys(n).length&&delete g[e])}else delete g[e];const l=`Invalidate '${t}' client. '${(null!==(i=h[e])&&void 0!==i?i:[]).length}' clients currently active.`;if(c)for(const e of c)ie(l,e);else ie(l)},V=(e,n)=>{if(!e.subscription)return;const{channels:r,channelGroups:i}=e.subscription,s=(null!=i?i:[]).filter((e=>!e.endsWith("-pnpres"))).map((e=>ce(e))).sort(),o=(null!=r?r:[]).filter((e=>!e.endsWith("-pnpres"))).map((e=>ce(e))).sort();if(0===o.length&&0===s.length)return;const l=s.length>0?s.join(","):void 0,u=0===o.length?",":o.join(","),a=Object.assign(Object.assign({instanceid:e.clientIdentifier,uuid:e.userId,requestid:c.createUUID()},e.authKey?{auth:e.authKey}:{}),l?{"channel-group":l}:{}),d={type:"send-request",clientIdentifier:e.clientIdentifier,subscriptionKey:e.subscriptionKey,request:{origin:e.origin,path:`/v2/presence/sub-key/${e.subscriptionKey}/channel/${u}/leave`,queryParameters:a,method:t.GET,headers:{},timeout:10,cancellable:!1,compressible:!1,identifier:a.requestid}};$(d,e,n)},J=e=>{const{clientIdentifier:t,subscriptionKey:n}=e.data;return!(!t||"string"!=typeof t)&&!(!n||"string"!=typeof n)},H=(e,t)=>{var n;const r=null!==(n=t.request.queryParameters["channel-group"])&&void 0!==n?n:"",i=t.request.path;let s,o;for(const n of e){const{subscription:e}=n;if(!e||!e.serviceRequestId)continue;const c=f[t.clientIdentifier],l=e.serviceRequestId;if(e.path===i&&e.channelGroupQuery===r)return ie(`Found identical request started by '${n.clientIdentifier}' client. \nWaiting for existing '${l}' request completion.`,c),e.serviceRequestId;{const r=v[e.serviceRequestId];if(s||(s=Y(t.request)),o||(o=X(t.request)),o.length&&!Z(r.channels,o))continue;if(s.length&&!Z(r.channelGroups,s))continue;return se(r,`'${t.request.identifier}' request channels and groups are subset of ongoing '${l}' request \nwhich has started by '${n.clientIdentifier}' client. Waiting for existing '${l}' request completion.`,c),e.serviceRequestId}}},Q=(e,t)=>{var n,r;const i=f[t.clientIdentifier];if(!i)return[];const s=t.request.queryParameters,o=te(i),c=null!==(n=s["filter-expr"])&&void 0!==n?n:"",l=s.uuid;return(null!==(r=h[t.subscriptionKey])&&void 0!==r?r:[]).filter((t=>t.userId===l&&te(t)===o&&t.subscription&&(0!==t.subscription.channels.length||0!==t.subscription.channelGroups.length)&&t.subscription.filterExpression===c&&("0"===e||"0"===t.subscription.timetoken||t.subscription.timetoken===e)))},B=e=>z(e),z=(e,t)=>{var n;const r=null!=t?t:f[e.clientIdentifier];if(!r)return[];const i=e.request.queryParameters,s=te(r),o=i.uuid;return(null!==(n=h[e.subscriptionKey])&&void 0!==n?n:[]).filter((e=>e.userId===o&&te(e)===s))},X=e=>{const t=e.path.split("/")[e.path.startsWith("/v2/subscribe/")?4:6];return","===t?[]:t.split(",").filter((e=>e.length>0))},Y=e=>{var t;const n=null!==(t=e.queryParameters["channel-group"])&&void 0!==t?t:"";return 0===n.length?[]:n.split(",").filter((e=>e.length>0))},Z=(e,t)=>{const n=new Set(e);return t.every(n.has,n)},ee=e=>{const t={type:"shared-worker-ping"},n=Object.values(f).filter((t=>t&&t.subscriptionKey===e));if(n.forEach((e=>{let r=!1;if(e&&e.lastPingRequest){const t=e.offlineClientsCheckInterval;if(!e.lastPongEvent||Math.abs(e.lastPongEvent-e.lastPingRequest)>.5*t){r=!0;for(const t of n)ie(`'${e.clientIdentifier}' client is inactive. Invalidating...`,t);_(e.subscriptionKey,e.clientIdentifier)}}e&&!r&&(e.lastPingRequest=(new Date).getTime()/1e3,R(e,t))})),n&&n.length>0&&n[0]){const t=n[0].offlineClientsCheckInterval;u[e]=setTimeout((()=>ee(e)),500*t-1)}},te=e=>{var t;return e.accessToken&&null!==(t=e.accessToken.token)&&void 0!==t?t:e.authKey},ne=e=>{const t=e.filter((e=>!!e.accessToken)).sort(((e,t)=>e.accessToken.expiration-t.accessToken.expiration)).pop();return t?t.authKey:void 0},re=e=>{const t=te(e);let n=`${e.userId}-${e.subscriptionKey}${t?`-${t}`:""}`;return e.subscription&&e.subscription.filterExpression&&(n+=`-${e.subscription.filterExpression}`),n},ie=(e,t)=>{const n=(t?[t]:Object.values(f)).filter((e=>e&&e.workerLogVerbosity)),r={type:"shared-worker-console-log",message:e};n.forEach((e=>{e&&R(e,r)}))},se=(e,t,n)=>{const r=(n?[n]:Object.values(f)).filter((e=>e&&e.workerLogVerbosity)),i={type:"shared-worker-console-dir",message:t,data:e};r.forEach((e=>{e&&R(e,i)}))},oe=e=>Object.keys(e).map((t=>{const n=e[t];return Array.isArray(n)?n.map((e=>`${t}=${ce(e)}`)).join("&"):`${t}=${ce(n)}`})).join("&"),ce=e=>encodeURIComponent(e).replace(/[!~*'()]/g,(e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`))}));