New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

topgun-socket

Package Overview
Dependencies
Maintainers
1
Versions
44
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

topgun-socket - npm Package Compare versions

Comparing version 1.4.2 to 1.4.3

2

dist/server.d.ts

@@ -99,2 +99,3 @@ import { Server } from 'http';

constructor(options: TGSocketServerOptions);
handleSocketConnection(wsSocket: WebSocket, upgradeReq?: any): void;
setAuthEngine(authEngine: AuthEngineType): void;

@@ -134,3 +135,2 @@ setCodecEngine(codecEngine: CodecEngine): void;

private _passThroughHandshakeAGMiddleware;
private _handleSocketConnection;
}

@@ -137,0 +137,0 @@

@@ -1,1 +0,1 @@

var TopGunSocket=(()=>{var Ke=Object.create;var Q=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ve=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,Je=Object.prototype.hasOwnProperty;var qe=(n,e,t)=>e in n?Q(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var de=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+n+'" is not supported')});var ze=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),pe=(n,e)=>{for(var t in e)Q(n,t,{get:e[t],enumerable:!0})},be=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ve(e))!Je.call(n,i)&&i!==t&&Q(n,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return n};var Xe=(n,e,t)=>(t=n!=null?Ke(Ge(n)):{},be(e||!n||!n.__esModule?Q(t,"default",{value:n,enumerable:!0}):t,n)),Ye=n=>be(Q({},"__esModule",{value:!0}),n);var w=(n,e,t)=>(qe(n,typeof e!="symbol"?e+"":e,t),t);var Ae=ze((Vt,Te)=>{var V=1e3,G=V*60,J=G*60,L=J*24,it=L*7,nt=L*365.25;Te.exports=function(n,e){e=e||{};var t=typeof n;if(t==="string"&&n.length>0)return st(n);if(t==="number"&&isFinite(n))return e.long?ot(n):at(n);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(n))};function st(n){if(n=String(n),!(n.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(n);if(!!e){var t=parseFloat(e[1]),r=(e[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return t*nt;case"weeks":case"week":case"w":return t*it;case"days":case"day":case"d":return t*L;case"hours":case"hour":case"hrs":case"hr":case"h":return t*J;case"minutes":case"minute":case"mins":case"min":case"m":return t*G;case"seconds":case"second":case"secs":case"sec":case"s":return t*V;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function at(n){var e=Math.abs(n);return e>=L?Math.round(n/L)+"d":e>=J?Math.round(n/J)+"h":e>=G?Math.round(n/G)+"m":e>=V?Math.round(n/V)+"s":n+"ms"}function ot(n){var e=Math.abs(n);return e>=L?ae(n,e,L,"day"):e>=J?ae(n,e,J,"hour"):e>=G?ae(n,e,G,"minute"):e>=V?ae(n,e,V,"second"):n+" ms"}function ae(n,e,t,r){var i=e>=t*1.5;return Math.round(n/t)+" "+r+(i?"s":"")}});var wt={};pe(wt,{TGSocket:()=>v,TGSocketServer:()=>z,attach:()=>He,listen:()=>kt});var O=class{next(e){return this.createAsyncIterator(e).next()}async once(e){let t=await this.next(e);return t.done&&await new Promise(()=>{}),t.value}createAsyncIterator(e){throw new TypeError("Method must be overriden by subclass")}createAsyncIterable(e){return{[Symbol.asyncIterator]:()=>this.createAsyncIterator(e)}}[Symbol.asyncIterator](){return this.createAsyncIterator()}};var ne=class extends O{name;_streamDemux;constructor(e,t){super(),this.name=t,this._streamDemux=e}createAsyncIterator(e){return this._streamDemux.createAsyncIterator(this.name,e)}};var se=class extends O{_nextConsumerId;_consumers;_linkedListTailNode;constructor(){super(),this._nextConsumerId=1,this._consumers={},this._linkedListTailNode={next:null}}write(e){this._write(e,!1)}close(){this._write(void 0,!0)}async _waitForNextDataNode(e){return new Promise((t,r)=>{let i,s=this._nextConsumerId++;if(e!==void 0){let a=new Error("Stream consumer iteration timed out");(async()=>{let o=Qe(e);i=o.timeoutId,await o.promise,a.name="TimeoutError",delete this._consumers[s],r(a)})()}this._consumers[s]={resolve:t,timeoutId:i}})}createAsyncIterator(e){let t=this._linkedListTailNode;return{next:async()=>(t.next||await this._waitForNextDataNode(e),t=t.next,t.data)}}_write(e,t){let r={data:{value:e,done:t},next:null};this._linkedListTailNode.next=r,this._linkedListTailNode=r,Object.values(this._consumers).forEach(i=>{i.timeoutId!==void 0&&clearTimeout(i.timeoutId),i.resolve()}),this._consumers={},this._nextConsumerId=1}};function Qe(n=0){let e,t=new Promise(r=>{e=setTimeout(r,n)});return{timeoutId:e,promise:t}}var _=class{_mainStream;constructor(){this._mainStream=new se}write(e,t){this._write(e,t,!1)}close(e,t){this._write(e,t,!0)}closeAll(){this._mainStream.close()}createAsyncIterator(e,t){let r=this._mainStream.createAsyncIterator(t);return{next:async()=>{for(;;){let i=await r.next();if(i.done)return i;if(i.value.name===e)return i.value.data}}}}stream(e){return new ne(this,e)}_write(e,t,r){this._mainStream.write({name:e,data:{value:t,done:r}})}};var D=class{_listenerDemux;constructor(){this._listenerDemux=new _}emit(e,t){this._listenerDemux.write(e,t)}listener(e){return this._listenerDemux.stream(e)}closeListener(e){this._listenerDemux.close(e)}closeAllListeners(){this._listenerDemux.closeAll()}};function ye(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{let e=Math.random()*16|0;return(n==="x"?e:e&3|8).toString(16)})}function ge(){return Math.abs(Math.random()*Math.random()*Date.now()|0).toString()+Math.abs(Math.random()*Math.random()*Date.now()|0).toString()}function Ee(n){let e=[],t=[];return function r(i,s){let a,o,c;if(typeof i=="object"&&i!==null&&!(i instanceof Boolean)&&!(i instanceof Date)&&!(i instanceof Number)&&!(i instanceof RegExp)&&!(i instanceof String)){for(a=0;a<e.length;a+=1)if(e[a]===i)return{$ref:t[a]};if(e.push(i),t.push(s),Object.prototype.toString.apply(i)==="[object Array]")for(c=[],a=0;a<i.length;a+=1)c[a]=r(i[a],s+"["+a+"]");else{c={};for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(c[o]=r(i[o],s+"["+JSON.stringify(o)+"]"))}return c}return i}(n,"$")}function k(){"use strict";return typeof function(){return this}()>"u"}var N=class extends Error{expiry;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,N.prototype),this.name="AuthTokenExpiredError",this.message=e,this.expiry=new Date(t),Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},j=class extends Error{isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,j.prototype),this.name="AuthTokenInvalidError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},H=class extends Error{date;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,H.prototype),this.name="AuthTokenNotBeforeError",this.message=e,this.date=t,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},x=class extends Error{expiredAt;date;isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,x.prototype),this.name="AuthTokenError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},U=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,U.prototype),this.name="AuthError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},S=class extends Error{type;constructor(e,t){super(e),Object.setPrototypeOf(this,S.prototype),this.name="SilentMiddlewareBlockedError",this.message=e,this.type=t,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},d=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,d.prototype),this.name="InvalidActionError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},T=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,T.prototype),this.name="InvalidArgumentsError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},P=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,P.prototype),this.name="InvalidOptionsError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var $=class extends Error{code;constructor(e,t){super(e),Object.setPrototypeOf(this,$.prototype),this.name="SocketProtocolError",this.message=e,this.code=t,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},B=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,B.prototype),this.name="ServerProtocolError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var K=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,K.prototype),this.name="TimeoutError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var R=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,R.prototype),this.name="BrokerError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var Se={1001:"Socket was disconnected",1002:"A WebSocket protocol error was encountered",1003:"Server terminated socket because it received invalid data",1005:"Socket closed without status code",1006:"Socket hung up",1007:"Message format was incorrect",1008:"Encountered a policy violation",1009:"Message was too big to process",1010:"Client ended the connection because the server did not comply with extension requirements",1011:"Server encountered an unexpected fatal condition",4e3:"Server ping timed out",4001:"Client pong timed out",4002:"Server failed to sign auth token",4003:"Failed to complete handshake",4004:"Client failed to save auth token",4005:"Did not receive #handshake from client before timeout",4006:"Failed to bind socket to message broker",4007:"Client connection establishment timed out",4008:"Server rejected handshake from client",4009:"Server received a message before the client handshake"},ke={1e3:"Socket closed normally",1001:"Socket hung up"},Ze={domain:1,domainEmitter:1,domainThrown:1};function Z(n,e){let t;if(n&&typeof n=="object"){t={message:n.message},e&&(t.stack=n.stack);for(let r in n)Ze[r]||(t[r]=n[r])}else typeof n=="function"?t="[function "+(n.name||"anonymous")+"]":t=n;return Ee(t)}function we(n){let e=null;if(n!=null)if(typeof n=="object"){e=new Error(n.message);for(let t in n)n.hasOwnProperty(t)&&(e[t]=n[t])}else e=n;return e}var et=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];function tt(n){let e=0,t="",r=new Uint8Array(n);for(;e<r.length;e++)t+=et[r[e]];return t}function ve(n=9){let e=new Uint8Array(n);try{return tt(e)}catch{return null}}var rt=crypto,F=rt;var Ne=Xe(Ae(),1);function _e(n){switch(n.length%4){case 0:break;case 2:n+="==";break;case 3:n+="=";break;default:throw new Error("Illegal base64url string!")}try{return JSON.parse(decodeURIComponent(escape(atob(n))))}catch{return null}}function ct(n){return{header:_e(n.split(".")[0].replace(/-/g,"+").replace(/_/g,"/")),payload:_e(n.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"))}}function Ce(n){return new Uint8Array(Array.prototype.map.call(atob(n.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"")),e=>e.charCodeAt(0)))}function q(n){return Ce(btoa(unescape(encodeURIComponent(n))))}function Oe(n){n=atob(n);let e=new ArrayBuffer(n.length),t=new Uint8Array(e);for(let r=0,i=n.length;r<i;r++)t[r]=n.charCodeAt(r);return e}var Pe={ES256:{name:"ECDSA",namedCurve:"P-256",hash:{name:"SHA-256"}},ES384:{name:"ECDSA",namedCurve:"P-384",hash:{name:"SHA-384"}},ES512:{name:"ECDSA",namedCurve:"P-521",hash:{name:"SHA-512"}},HS256:{name:"HMAC",hash:{name:"SHA-256"}},HS384:{name:"HMAC",hash:{name:"SHA-384"}},HS512:{name:"HMAC",hash:{name:"SHA-512"}},RS256:{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},RS384:{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-384"}},RS512:{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-512"}}};async function Re(n,e,t={algorithm:"HS256",throwError:!1},r){typeof t=="string"&&(t={algorithm:t,throwError:!1}),t={algorithm:"HS256",throwError:!1,...t};function i(l){if(r)return r(null,l);throw l}typeof n!="string"&&i(new Error("AuthTokenInvalidError")),typeof e!="string"&&typeof e!="object"&&i(new Error("secret must be a string or a JWK object")),typeof t.algorithm!="string"&&i(new Error("options.algorithm must be a string"));let s=n.split(".");s.length!==3&&i(new Error("token must consist of 3 parts"));let a=Pe[t.algorithm];a||i(new Error("algorithm not found"));let{payload:o}=ct(n);if(!o)return t.throwError&&i(new Error("ParseError")),!1;if(o.nbf&&o.nbf>Math.floor(Date.now()/1e3))return t.throwError&&i(new Error("NotYetValid")),!1;if(o.exp&&o.exp<=Math.floor(Date.now()/1e3))return t.throwError&&i(new Error("TokenExpiredError")),!1;let c="raw",m;typeof e=="object"?(c="jwk",m=e):typeof e=="string"&&e.startsWith("-----BEGIN")?(c="spki",m=Oe(e.replace(/-----BEGIN.*?-----/g,"").replace(/-----END.*?-----/g,"").replace(/\s/g,""))):m=q(e);let b=await F.subtle.importKey(c,m,a,!1,["verify"]),y=await F.subtle.verify(a,b,Ce(s[2]),q(`${s[0]}.${s[1]}`))?o:!1;return typeof r=="function"&&r(null,y),y}function W(n){return typeof n=="string"}function ee(n){return typeof n=="number"}function De(n){return typeof n=="boolean"}function Me(n){if(typeof n!="object"||n===null)return!1;let e=Object.getPrototypeOf(n);return e===null||e===Object.prototype}function xe(n,e){let t=e||Math.floor(Date.now()/1e3);if(typeof n=="string"){let r=(0,Ne.default)(n);return typeof r>"u"?void 0:Math.floor(t+r/1e3)}else return typeof n=="number"?t+n:void 0}function me(n){return btoa(String.fromCharCode.apply(0,Array.from(n))).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var ht=["ES256","ES384","ES512","HS256","HS384","HS512","RS256","RS384","RS512","none"],lt={expiresIn:{isValid:n=>ee(n)||W(n)&&n,message:'"expiresIn" should be a number of seconds or string representing a timespan'},notBefore:{isValid:n=>ee(n)||W(n)&&n,message:'"notBefore" should be a number of seconds or string representing a timespan'},audience:{isValid:n=>W(n)||Array.isArray(n),message:'"audience" must be a string or array'},algorithm:{isValid:n=>ht.includes(n),message:'"algorithm" must be a valid string enum value'},header:{isValid:Me,message:'"header" must be an object'},issuer:{isValid:W,message:'"issuer" must be a string'},subject:{isValid:W,message:'"subject" must be a string'},jwtid:{isValid:W,message:'"jwtid" must be a string'},noTimestamp:{isValid:De,message:'"noTimestamp" must be a boolean'},keyid:{isValid:W,message:'"keyid" must be a string'},mutatePayload:{isValid:De,message:'"mutatePayload" must be a boolean'}},ut={iat:{isValid:ee,message:'"iat" should be a number of seconds'},exp:{isValid:ee,message:'"exp" should be a number of seconds'},nbf:{isValid:ee,message:'"nbf" should be a number of seconds'}};function Be(n,e,t,r){if(!Me(t))throw new Error('Expected "'+r+'" to be a plain object.');Object.keys(t).forEach(function(i){let s=n[i];if(!s){if(!e)throw new Error('"'+i+'" is not allowed in "'+r+'"');return}if(!s.isValid(t[i]))throw new Error(s.message)})}function dt(n){return Be(lt,!1,n,"options")}function mt(n){return Be(ut,!0,n,"payload")}var Ie={audience:"aud",issuer:"iss",subject:"sub",jwtid:"jti"},ft=["expiresIn","notBefore","noTimestamp","audience","issuer","subject","jwtid"];async function Le(n,e,t,r){typeof t=="function"?(r=t,t={}):t=t||{},t={algorithm:"HS256",...t};let i=typeof n=="object",s=Object.assign({alg:t.algorithm,typ:i?"JWT":void 0},t.header);function a(u){if(r)return r(u);throw u}if(!e&&t.algorithm!=="none"&&a(new Error("secretOrPrivateKey must have a value")),typeof n>"u")a(new Error("payload is required"));else if(i){try{mt(n)}catch(u){a(u)}t.mutatePayload||(n=Object.assign({},n))}else{let u=ft.filter(function(E){return typeof t[E]<"u"});u.length>0&&a(new Error("invalid "+u.join(",")+" option for "+typeof n+" payload"))}typeof n.exp<"u"&&typeof t.expiresIn<"u"&&a(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.')),typeof n.nbf<"u"&&typeof t.notBefore<"u"&&a(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));try{dt(t)}catch(u){a(u)}let o=n.iat||Math.floor(Date.now()/1e3);if(t.noTimestamp?delete n.iat:i&&(n.iat=o),typeof t.notBefore<"u"){try{n.nbf=xe(t.notBefore,o)}catch(u){a(u)}typeof n.nbf>"u"&&a(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}if(typeof t.expiresIn<"u"&&typeof n=="object"){try{n.exp=xe(t.expiresIn,o)}catch(u){a(u)}typeof n.exp>"u"&&a(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}Object.keys(Ie).forEach(function(u){let E=Ie[u];if(typeof t[u]<"u"){if(typeof n[E]<"u")return a(new Error('Bad "options.'+u+'" option. The payload already has an "'+E+'" property.'));n[E]=t[u]}});let c=JSON.stringify(n),m=`${me(q(JSON.stringify({...s})))}.${me(q(c))}`,b="raw",y;typeof e=="object"?(b="jwk",y=e):typeof e=="string"&&e.startsWith("-----BEGIN")?(b="pkcs8",y=Oe(e.replace(/-----BEGIN.*?-----/g,"").replace(/-----END.*?-----/g,"").replace(/\s/g,""))):y=q(e);let l=Pe[t.algorithm];l||a(new Error("algorithm not found"));let h=await F.subtle.importKey(b,y,l,!1,["sign"]),f=await F.subtle.sign(l,h,q(m)),p=`${m}.${me(new Uint8Array(f))}`;return typeof r=="function"&&r(null,p),p}var oe=class{verifyToken(e,t,r){r=r||{};let i=Object.assign({},r);return delete i.socket,typeof e=="string"||e==null?new Promise((s,a)=>{Re(e,t,i).then(o=>{o?s(o):a(new x("Invalid token"))}).catch(o=>a(o))}):Promise.reject(new T("Invalid token format - Token must be a string"))}signToken(e,t,r){r=r||{};let i=Object.assign({},r);return new Promise((s,a)=>{Le(e,t,i).then(o=>{o?s(o):a(new x("Sign token error"))}).catch(o=>a(o))})}};var fe={};pe(fe,{decode:()=>gt,encode:()=>Et});var M=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global||void 0;function A(){return typeof process=="object"}var ce="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",pt=/^[ \n\r\t]*[{\[]/,bt=n=>{let e=new Uint8Array(n),t=e.length,r="";for(let i=0;i<t;i+=3)r+=ce[e[i]>>2],r+=ce[(e[i]&3)<<4|e[i+1]>>4],r+=ce[(e[i+1]&15)<<2|e[i+2]>>6],r+=ce[e[i+2]&63];return t%3===2?r=r.substring(0,r.length-1)+"=":t%3===1&&(r=r.substring(0,r.length-2)+"=="),r},yt=(n,e)=>{if(M.ArrayBuffer&&e instanceof M.ArrayBuffer)return{base64:!0,data:bt(e)};if(M.Buffer){if(e instanceof M.Buffer)return{base64:!0,data:e.toString("base64")};if(e&&e.type==="Buffer"&&Array.isArray(e.data)){let t;return M.Buffer.from?t=M.Buffer.from(e.data):t=new M.Buffer(e.data),{base64:!0,data:t.toString("base64")}}}return e};function gt(n){if(n===null)return null;if(n==="#1"||n==="#2")return n;let e=n.toString();if(!pt.test(e))return e;try{return JSON.parse(e)}catch{}return e}function Et(n){return n==="#1"||n==="#2"?n:A()?JSON.stringify(n,yt):JSON.stringify(n)}var he=class{socket;id;sent;constructor(e,t){this.socket=e,this.id=t,this.sent=!1}end(e,t){if(this.id){let r={rid:this.id};e!==void 0&&(r.data=e),this._respond(r,t)}}error(e,t,r){if(this.id){let i=Z(e),s={rid:this.id,error:i};t!==void 0&&(s.data=t),this._respond(s,r)}}callback(e,t,r){e?this.error(e,t,r):this.end(t,r)}_respond(e,t){if(this.sent)throw new d(`Response ${this.id} has already been sent`);this.sent=!0,this.socket.sendObject(e,t)}};function We(n){return Object.prototype.toString.call(n)==="[object Date]"}function je(n){return!!n&&typeof n=="object"&&Object.prototype.toString.call(n)!=="[object Array]"}function te(n){if(We(n))return new Date(n.getTime());if(Array.isArray(n))return[...n].map(e=>te(e));if(n instanceof Map||n instanceof Set)return n;if(je(n)){let e={};for(let t of Object.keys(n))e[t]=te(n[t]);return e}return n}var I=class extends D{id;server;socket;state;authState;request;remoteAddress;remoteFamily;remotePort;forwardedForAddress;channelSubscriptions;channelSubscriptionsCount;authToken;signedAuthToken;exchange;_handshakeTimeoutRef;CONNECTING=I.CONNECTING;OPEN=I.OPEN;CLOSED=I.CLOSED;AUTHENTICATED=I.AUTHENTICATED;UNAUTHENTICATED=I.UNAUTHENTICATED;_autoAckRPCs;_callbackMap;_pingIntervalTicker;_receiverDemux;_procedureDemux;_cid;_batchSendList;_pingTimeoutTicker;_batchTimeout;constructor(e,t,r){super(),this._autoAckRPCs={"#publish":1},this.id=e,this.server=t,this.socket=r,this.state=this.CONNECTING,this.authState=this.UNAUTHENTICATED,this._receiverDemux=new _,this._procedureDemux=new _,this.request=this.socket.upgradeReq||{},this.request.connection?(this.remoteAddress=this.request.connection.remoteAddress,this.remoteFamily=this.request.connection.remoteFamily,this.remotePort=this.request.connection.remotePort):(this.remoteAddress=this.request.remoteAddress,this.remoteFamily=this.request.remoteFamily,this.remotePort=this.request.remotePort),this.request.forwardedForAddress&&(this.forwardedForAddress=this.request.forwardedForAddress),this._cid=1,this._callbackMap={},this._batchSendList=[],this.channelSubscriptions={},this.channelSubscriptionsCount=0,this._on("error",async i=>{this.emitError(i)}),this._on("close",async(i,s)=>{let a=s&&s.toString();this._onClose(i,a)}),this.server.pingTimeoutDisabled||(this._pingIntervalTicker=setInterval(this._sendPing.bind(this),this.server.pingInterval)),this._resetPongTimeout(),this._on("message",async i=>{let s=A()?i:i.data;this._resetPongTimeout(),this.emit("message",{message:s});let a;try{a=this.decode(s)}catch(o){o.name==="Error"&&(o.name="InvalidMessageError"),this.emitError(o);return}if(a==="#2"){let o=this.getAuthToken();this.server.isAuthTokenExpired(o)&&this.deauthenticate()}else if(Array.isArray(a)){let o=a.length;for(let c=0;c<o;c++)this._handleRemoteEventObject(a[c],s)}else this._handleRemoteEventObject(a,s)})}receiver(e){return this._receiverDemux.stream(e)}closeReceiver(e){this._receiverDemux.close(e)}procedure(e){return this._procedureDemux.stream(e)}closeProcedure(e){this._procedureDemux.close(e)}getState(){return this.state}getBytesReceived(){return this.socket?.bytesReceived}emitError(e){this.emit("error",{error:e})}disconnect(e,t){if(e=e||1e3,typeof e!="number"){let r=new T("If specified, the code argument must be a number");this.emitError(r)}this.state!==this.CLOSED&&(this._onClose(e,t),this.socket.close(e,t))}terminate(){this.socket.terminate()}send(e,t){A()?this.socket.send(e,t,r=>{r&&this._onClose(1006,r.toString())}):this.socket.send(e)}decode(e){return this.server.codec.decode(e)}encode(e){return this.server.codec.encode(e)}sendObjectBatch(e){this._batchSendList.push(e),!this._batchTimeout&&(this._batchTimeout=setTimeout(()=>{if(delete this._batchTimeout,this._batchSendList.length){let t;try{t=this.encode(this._batchSendList)}catch(r){this.emitError(r)}t!=null&&this.send(t),this._batchSendList=[]}},this.server.options.pubSubBatchDuration||0))}sendObjectSingle(e){let t;try{t=this.encode(e)}catch(r){this.emitError(r)}t!=null&&this.send(t)}sendObject(e,t){t&&t.batch?this.sendObjectBatch(e):this.sendObjectSingle(e)}transmit(e,t,r){return this.server.verifyOutboundEvent(this,e,t,r,(i,s)=>{let a={event:e};s!==void 0&&(a.data=s),i||(r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(a))}),Promise.resolve()}invoke(e,t,r){return new Promise((i,s)=>{this.server.verifyOutboundEvent(this,e,t,r,(a,o)=>{if(a){s(a);return}let c={event:e,cid:this._nextCallId()};o!==void 0&&(c.data=o);let m=setTimeout(()=>{let b=new K(`Event response for "${e}" timed out`);delete this._callbackMap[c.cid],s(b)},this.server.ackTimeout);this._callbackMap[c.cid]={callback:(b,y)=>{if(b){s(b);return}i(y)},timeout:m},r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(c)})})}triggerAuthenticationEvents(e){if(e!==this.AUTHENTICATED){let t={oldAuthState:e,newAuthState:this.authState,authToken:this.authToken};this.emit("authStateChange",t),this.server.emit("authenticationStateChange",{socket:this,...t})}this.emit("authenticate",{authToken:this.authToken}),this.server.emit("authentication",{socket:this,authToken:this.authToken})}async setAuthToken(e,t){let r=te(e),i=this.authState;if(this.authState=this.AUTHENTICATED,t==null)t={};else if(t=te(t),t.algorithm!=null){delete t.algorithm;let l=new T("Cannot change auth token algorithm at runtime - It must be specified as a config option on launch");this.emitError(l)}t.mutatePayload=!0;let s=t.rejectOnFailedDelivery;delete t.rejectOnFailedDelivery;let a=this.server.defaultSignatureOptions,o;t.expiresIn==null?o=a.expiresIn:o=t.expiresIn,r?r.exp==null?t.expiresIn=o:delete t.expiresIn:t.expiresIn=o,a.algorithm!=null&&(t.algorithm=a.algorithm),this.authToken=r;let c=l=>{throw this.emitError(l),this._onClose(4002,l.toString()),this.socket.close(4002),l},m=async l=>{let h={token:l};try{return await this.invoke("#setAuthToken",h)}catch(f){throw new U(`Failed to deliver auth token to client - ${f}`)}},b;try{b=this.server.auth.signToken(r,this.server.signatureKey,t)}catch(l){c(l)}let y;if(b instanceof Promise)try{y=await b}catch(l){c(l)}else y=b;this.authToken===r&&(this.signedAuthToken=y,this.emit("authTokenSigned",{signedAuthToken:y})),this.triggerAuthenticationEvents(i);try{await m(y)}catch(l){if(this.emitError(l),s)throw l}}getAuthToken(){return this.authToken}deauthenticateSelf(){let e=this.authState,t=this.authToken;if(this.signedAuthToken=null,this.authToken=null,this.authState=this.UNAUTHENTICATED,e!==this.UNAUTHENTICATED){let r={oldAuthState:e,newAuthState:this.authState};this.emit("authStateChange",r),this.server.emit("authenticationStateChange",{socket:this,...r})}this.emit("deauthenticate",{oldAuthToken:t}),this.server.emit("deauthentication",{socket:this,oldAuthToken:t})}deauthenticate(){return this.deauthenticateSelf(),this.invoke("#removeAuthToken")}kickOut(e,t){return e==null?Object.keys(this.channelSubscriptions).forEach(r=>{delete this.channelSubscriptions[r],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:r})}):(delete this.channelSubscriptions[e],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:e})),this.server.brokerEngine.unsubscribeSocket(this,e)}subscriptions(){return Object.keys(this.channelSubscriptions)}isSubscribed(e){return!!this.channelSubscriptions[e]}_onClose(e,t){if(clearInterval(this._pingIntervalTicker),clearTimeout(this._pingTimeoutTicker),this.state!==this.CLOSED){let r=this.state;if(this.state=this.CLOSED,r===this.CONNECTING?this.emit("connectAbort",{code:e,reason:t}):this.emit("disconnect",{code:e,reason:t}),this.emit("close",{code:e,reason:t}),!I.ignoreStatuses[e]){let i;if(t){let a;if(typeof t=="object")try{a=JSON.stringify(t)}catch{a=t.toString()}else a=t;i=`Socket connection closed with status code ${e} and reason: ${a}`}else i=`Socket connection closed with status code ${e}`;let s=new $(I.errorStatuses[e]||i,e);this.emitError(s)}}}_sendPing(){this.state!==this.CLOSED&&this.sendObject("#1")}_handleRemoteEventObject(e,t){if(e&&e.event!=null){let r=e.event,i={socket:this,event:r,data:e.data};if(e.cid==null)this.server.verifyInboundRemoteEvent(i,(s,a)=>{s||this._receiverDemux.write(r,a)});else{i.cid=e.cid;let s=new he(this,i.cid);this.server.verifyInboundRemoteEvent(i,(a,o,c)=>{a?s.error(a):this._autoAckRPCs[r]?c!==void 0?s.end(c):s.end():this._procedureDemux.write(r,{data:o,end:m=>{s.end(m)},error:m=>{s.error(m)}})})}}else if(e&&e.rid!=null){let r=this._callbackMap[e.rid];if(r){clearTimeout(r.timeout),delete this._callbackMap[e.rid];let i=we(e.error);r.callback(i,e.data)}}else this.emit("raw",{message:t})}_resetPongTimeout(){this.server.pingTimeoutDisabled||(clearTimeout(this._pingTimeoutTicker),this._pingTimeoutTicker=setTimeout(()=>{this._onClose(4001),this.socket.close(4001)},this.server.pingTimeout))}_nextCallId(){return this._cid++}_on(e,t){A()?this.socket.on(e,t):this.socket.addEventListener(e,t)}},v=I;w(v,"CONNECTING","connecting"),w(v,"OPEN","open"),w(v,"CLOSED","closed"),w(v,"AUTHENTICATED","authenticated"),w(v,"UNAUTHENTICATED","unauthenticated"),w(v,"ignoreStatuses",ke),w(v,"errorStatuses",Se);async function St(n,e){for(let t=0;t<n.length;t++)await e(n[t],t,n)}async function C(n,...e){let t=typeof e[e.length-1]=="function"?e.pop():()=>{},r=null,i=[];return await St(n,async s=>{if(!r)try{let a=await s(...e);i.push(a)}catch(a){i.push(void 0),r=a}}),t(r,i),i}var re=class extends O{PENDING;SUBSCRIBED;UNSUBSCRIBED;name;client;_pendingSubscriptionCid;_eventDemux;_dataStream;constructor(e,t,r,i){super(),this.PENDING=re.PENDING,this.SUBSCRIBED=re.SUBSCRIBED,this.UNSUBSCRIBED=re.UNSUBSCRIBED,this.name=e,this.client=t,this._eventDemux=r,this._dataStream=i}get state(){return this.client.getChannelState(this.name)}set state(e){throw new Error("Cannot directly set channel state")}get options(){return this.client.getChannelOptions(this.name)}set options(e){throw new Error("Cannot directly set channel options")}createAsyncIterator(e){return this._dataStream.createAsyncIterator(e)}listener(e){return this._eventDemux.stream(`${this.name}/${e}`)}closeListener(e){this._eventDemux.close(`${this.name}/${e}`)}closeAllListeners(){this._eventDemux.closeAll()}close(){this.client.closeChannel(this.name)}subscribe(e){this.client.subscribe(this.name,e)}unsubscribe(){this.client.unsubscribe(this.name)}isSubscribed(e){return this.client.isSubscribed(this.name,e)}publish(e){return this.client.publish(this.name,e)}},g=re;w(g,"PENDING","pending"),w(g,"SUBSCRIBED","subscribed"),w(g,"UNSUBSCRIBED","unsubscribed");var le=class extends D{_broker;_channelMap;_channelEventDemux;_channelDataDemux;constructor(e){super(),this._broker=e,this._channelMap={},this._channelEventDemux=new _,this._channelDataDemux=new _,(async()=>{for await(let{channel:t,data:r}of this._broker.listener("publish"))this._channelDataDemux.write(t,r)})()}destroy(){this._broker.closeAllListeners()}publish(e,t){return this._broker.publish(e,t)}subscribe(e){let t=this._channelMap[e];t||(t={name:e,state:g.PENDING},this._channelMap[e]=t,this._triggerChannelSubscribe(t));let r=this._channelDataDemux.stream(e);return new g(e,this,this._channelEventDemux,r)}unsubscribe(e){let t=this._channelMap[e];t&&this._triggerChannelUnsubscribe(t)}channel(e){let t=this._channelDataDemux.stream(e);return new g(e,this,this._channelEventDemux,t)}getChannelState(e){let t=this._channelMap[e];return t?t.state:g.UNSUBSCRIBED}getChannelOptions(e){return{}}subscriptions(e){let t=[];return Object.keys(this._channelMap).forEach(r=>{(e||this._channelMap[r].state===g.SUBSCRIBED)&&t.push(r)}),t}isSubscribed(e,t){let r=this._channelMap[e];return t?!!r:!!r&&r.state===g.SUBSCRIBED}_triggerChannelSubscribe(e){let t=e.name;e.state=g.SUBSCRIBED,this._channelEventDemux.write(`${t}/subscribe`,{}),this.emit("subscribe",{channel:t})}_triggerChannelUnsubscribe(e){let t=e.name;delete this._channelMap[t],e.state===g.SUBSCRIBED&&(this._channelEventDemux.write(`${t}/unsubscribe`,{}),this.emit("unsubscribe",{channel:t}))}};var ue=class extends D{isReady;_exchangeClient;_clientSubscribers;_clientSubscribersCounter;constructor(){super(),this.isReady=!1,this._exchangeClient=new le(this),this._clientSubscribers={},this._clientSubscribersCounter={},setTimeout(()=>{this.isReady=!0,this.emit("ready",{})},0)}exchange(){return this._exchangeClient}subscribeSocket(e,t){return this._clientSubscribers[t]||(this._clientSubscribers[t]={},this._clientSubscribersCounter[t]=0),this._clientSubscribers[t][e.id]||(this._clientSubscribersCounter[t]++,this.emit("subscribe",{channel:t})),this._clientSubscribers[t][e.id]=e,Promise.resolve()}unsubscribeSocket(e,t){return this._clientSubscribers[t]&&this._clientSubscribers[t][e.id]&&(this._clientSubscribersCounter[t]--,delete this._clientSubscribers[t][e.id],this._clientSubscribersCounter[t]<=0&&(delete this._clientSubscribers[t],delete this._clientSubscribersCounter[t],this.emit("unsubscribe",{channel:t}))),Promise.resolve()}subscriptions(){return Object.keys(this._clientSubscribers)}isSubscribed(e){return!!this._clientSubscribers[e]}publish(e,t,r){let i={channel:e,data:t},s=this._clientSubscribers[e]||{};return Object.keys(s).forEach(a=>{s[a].transmit("#publish",i)}),r||this.emit("publish",i),Promise.resolve()}};var z=class extends D{options;MIDDLEWARE_HANDSHAKE_WS;MIDDLEWARE_HANDSHAKE_AG;MIDDLEWARE_TRANSMIT;MIDDLEWARE_INVOKE;MIDDLEWARE_SUBSCRIBE;MIDDLEWARE_PUBLISH_IN;MIDDLEWARE_PUBLISH_OUT;MIDDLEWARE_AUTHENTICATE;origins;ackTimeout;handshakeTimeout;pingInterval;pingTimeout;pingTimeoutDisabled;allowClientPublish;perMessageDeflate;httpServer;socketChannelLimit;brokerEngine;appName;middlewareEmitWarnings;isReady;signatureKey;verificationKey;authVerifyAsync;authSignAsync;defaultVerificationOptions;defaultSignatureOptions;auth;codec;clients;clientsCount;pendingClients;pendingClientsCount;exchange;_middleware;_allowAllOrigins;wsServer;_path;constructor(e){super();let t={brokerEngine:new ue,wsEngine:"ws",wsEngineServerOptions:{},maxPayload:null,allowClientPublish:!0,ackTimeout:1e4,handshakeTimeout:1e4,pingTimeout:2e4,pingTimeoutDisabled:!1,pingInterval:8e3,origins:"*:*",appName:ye(),path:"/topgunsocket/",authDefaultExpiry:86400,authSignAsync:!1,authVerifyAsync:!0,pubSubBatchDuration:null,middlewareEmitWarnings:!0};this.options=Object.assign(t,e||{}),this.MIDDLEWARE_HANDSHAKE_WS="handshakeWS",this.MIDDLEWARE_HANDSHAKE_AG="handshakeAG",this.MIDDLEWARE_TRANSMIT="transmit",this.MIDDLEWARE_INVOKE="invoke",this.MIDDLEWARE_SUBSCRIBE="subscribe",this.MIDDLEWARE_PUBLISH_IN="publishIn",this.MIDDLEWARE_PUBLISH_OUT="publishOut",this.MIDDLEWARE_AUTHENTICATE="authenticate",this._middleware={},this._middleware[this.MIDDLEWARE_HANDSHAKE_WS]=[],this._middleware[this.MIDDLEWARE_HANDSHAKE_AG]=[],this._middleware[this.MIDDLEWARE_TRANSMIT]=[],this._middleware[this.MIDDLEWARE_INVOKE]=[],this._middleware[this.MIDDLEWARE_SUBSCRIBE]=[],this._middleware[this.MIDDLEWARE_PUBLISH_IN]=[],this._middleware[this.MIDDLEWARE_PUBLISH_OUT]=[],this._middleware[this.MIDDLEWARE_AUTHENTICATE]=[],this.origins=t.origins,this._allowAllOrigins=this.origins.indexOf("*:*")!==-1,this.ackTimeout=t.ackTimeout,this.handshakeTimeout=t.handshakeTimeout,this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.pingTimeoutDisabled=t.pingTimeoutDisabled,this.allowClientPublish=t.allowClientPublish,this.perMessageDeflate=t.perMessageDeflate,this.httpServer=t.httpServer,this.socketChannelLimit=t.socketChannelLimit,this.brokerEngine=t.brokerEngine,this.appName=t.appName||"",this.middlewareEmitWarnings=t.middlewareEmitWarnings,this._path=t.path.replace(/\/?$/,"/").replace(/^\/?/,"/"),this.brokerEngine.isReady?(this.isReady=!0,this.emit("ready",{})):(this.isReady=!1,(async()=>(await this.brokerEngine.listener("ready").once(),this.isReady=!0,this.emit("ready",{})))());let r=typeof t.wsEngine=="string"?de(t.wsEngine):t.wsEngine;if(!r||!r.Server)throw new P("The wsEngine option must be a path or module name which points to a valid WebSocket engine module with a compatible interface");let i=r.Server;if(t.authPrivateKey!=null||t.authPublicKey!=null){if(t.authPrivateKey==null)throw new P("The authPrivateKey option must be specified if authPublicKey is specified");if(t.authPublicKey==null)throw new P("The authPublicKey option must be specified if authPrivateKey is specified");this.signatureKey=t.authPrivateKey,this.verificationKey=t.authPublicKey}else t.authKey==null&&(t.authKey=ve(32)),this.signatureKey=t.authKey,this.verificationKey=t.authKey;this.authVerifyAsync=t.authVerifyAsync,this.authSignAsync=t.authSignAsync,this.defaultVerificationOptions={async:this.authVerifyAsync},t.authVerifyAlgorithms!=null?this.defaultVerificationOptions.algorithms=t.authVerifyAlgorithms:t.authAlgorithm!=null&&(this.defaultVerificationOptions.algorithms=[t.authAlgorithm]),this.defaultSignatureOptions={expiresIn:t.authDefaultExpiry,async:this.authSignAsync},t.authAlgorithm!=null&&(this.defaultSignatureOptions.algorithm=t.authAlgorithm),t.authEngine?this.auth=t.authEngine:this.auth=new oe,t.codecEngine?this.codec=t.codecEngine:this.codec=fe,this.clients={},this.clientsCount=0,this.pendingClients={},this.pendingClientsCount=0,this.exchange=this.brokerEngine.exchange();let s=t.wsEngineServerOptions||{};s.server=this.httpServer,s.verifyClient=this.verifyHandshake.bind(this),s.path==null&&this._path!=null&&(s.path=this._path),s.perMessageDeflate==null&&this.perMessageDeflate!=null&&(s.perMessageDeflate=this.perMessageDeflate),s.handleProtocols==null&&t.handleProtocols!=null&&(s.handleProtocols=t.handleProtocols),s.maxPayload==null&&t.maxPayload!=null&&(s.maxPayload=t.maxPayload),s.clientTracking==null&&(s.clientTracking=!1),A()?(this.wsServer=new i(s),this.wsServer.on("error",this._handleServerError.bind(this)),this.wsServer.on("connection",this._handleSocketConnection.bind(this))):(this.wsServer=i,this.wsServer.addEventListener("close",this._handleServerError.bind(this)),this.wsServer.addEventListener("error",this._handleServerError.bind(this)),this._handleSocketConnection(i))}setAuthEngine(e){this.auth=e}setCodecEngine(e){this.codec=e}emitError(e){this.emit("error",{error:e})}emitWarning(e){this.emit("warning",{warning:e})}close(e){return this.isReady=!1,new Promise((t,r)=>{if(A()&&this.wsServer.close(i=>{if(i){r(i);return}t()}),!e)for(let i of Object.values(this.clients))i.terminate()})}getPath(){return this._path}generateId(){return ge()}addMiddleware(e,t){if(!this._middleware[e])throw new T(`Middleware type "${e}" is not supported`);this._middleware[e].push(t)}removeMiddleware(e,t){let r=this._middleware[e];this._middleware[e]=r.filter(i=>i!==t)}async verifyHandshake(e,t){let r=e.req,i=e.origin;(i==="null"||i==null)&&(i="*");let s=!1;if(this._allowAllOrigins)s=!0;else try{let a=new URL(i),o=a.port||(a.protocol==="https:"?443:80);s=~this.origins.indexOf(a.hostname+":"+o)||~this.origins.indexOf(a.hostname+":*")||~this.origins.indexOf("*:"+o)}catch{}if(s){let a=this._middleware[this.MIDDLEWARE_HANDSHAKE_WS];if(a.length){let o=!1;await C(a,r,c=>{o?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_HANDSHAKE_WS} middleware was already invoked`)):(o=!0,c?(c===!0||c.silent?c=new S(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_WS} middleware`,this.MIDDLEWARE_HANDSHAKE_WS):this.middlewareEmitWarnings&&this.emitWarning(c),t(!1,401,typeof c=="string"?c:c.message)):t(!0))})}else t(!0)}else{let a=new B(`Failed to authorize socket handshake - Invalid origin: ${i}`);this.emitWarning(a),t(!1,403,a.message)}}verifyInboundRemoteEvent(e,t){let r=e.socket,i=r.getAuthToken();this.isAuthTokenExpired(i)&&(e.authTokenExpiredError=new N("The socket auth token has expired",i.exp),r.deauthenticate()),this._passThroughMiddleware(e,t)}isAuthTokenExpired(e){if(e&&e.exp!=null){let t=Date.now(),r=e.exp*1e3;return t>r}return!1}async verifyOutboundEvent(e,t,r,i,s){let a=!1;if(t==="#publish"){let o={socket:e,channel:r.channel,data:r.data};await C(this._middleware[this.MIDDLEWARE_PUBLISH_OUT],o,c=>{a?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_PUBLISH_OUT} middleware was already invoked`)):(a=!0,o.data!==void 0&&(r.data=o.data),c?(c===!0||c.silent?c=new S(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_OUT} middleware`,this.MIDDLEWARE_PUBLISH_OUT):this.middlewareEmitWarnings&&this.emitWarning(c),s(c,r)):(i&&o.useCache&&(i.useCache=!0),s(null,r)))})}else s(null,r)}async _processSubscribeAction(e,t,r){let i=!1,s=e.data||{};t.channel=s.channel,t.waitForAuth=s.waitForAuth,t.data=s.data,t.waitForAuth&&t.authTokenExpiredError?r(t.authTokenExpiredError,s):await C(this._middleware[this.MIDDLEWARE_SUBSCRIBE],t,a=>{i?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_SUBSCRIBE} middleware was already invoked`)):(i=!0,a&&(a===!0||a.silent?a=new S(`Action was silently blocked by ${this.MIDDLEWARE_SUBSCRIBE} middleware`,this.MIDDLEWARE_SUBSCRIBE):this.middlewareEmitWarnings&&this.emitWarning(a)),t.data!==void 0&&(s.data=t.data),r(a,s))})}async _processTransmitAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await C(this._middleware[this.MIDDLEWARE_TRANSMIT],t,s=>{i?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_TRANSMIT} middleware was already invoked`)):(i=!0,s&&(s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_TRANSMIT} middleware`,this.MIDDLEWARE_TRANSMIT):this.middlewareEmitWarnings&&this.emitWarning(s)),r(s,t.data))})}async _processPublishAction(e,t,r){let i=!1;if(this.allowClientPublish){let s=e.data||{};t.channel=s.channel,t.data=s.data,await C(this._middleware[this.MIDDLEWARE_PUBLISH_IN],t,a=>{if(i)this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_PUBLISH_IN} middleware was already invoked`));else if(i=!0,t.data!==void 0&&(s.data=t.data),a)a===!0||a.silent?a=new S(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_IN} middleware`,this.MIDDLEWARE_PUBLISH_IN):this.middlewareEmitWarnings&&this.emitWarning(a),r(a,s,t.ackData);else{if(typeof t.channel!="string"){a=new R(`Socket ${t.socket.id} tried to publish to an invalid ${t.channel} channel`),this.emitWarning(a),r(a,s,t.ackData);return}(async()=>{let o;try{await this.exchange.publish(t.channel,t.data)}catch(c){o=c,this.emitWarning(o)}r(o,s,t.ackData)})()}})}else{let s=new d("Client publish feature is disabled");this.emitWarning(s),r(s)}}async _processInvokeAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await C(this._middleware[this.MIDDLEWARE_INVOKE],t,s=>{i?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_INVOKE} middleware was already invoked`)):(i=!0,s&&(s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_INVOKE} middleware`,this.MIDDLEWARE_INVOKE):this.middlewareEmitWarnings&&this.emitWarning(s)),r(s,t.data))})}_passThroughMiddleware(e,t){let r={socket:e.socket};e.authTokenExpiredError!=null&&(r.authTokenExpiredError=e.authTokenExpiredError);let i=e.event;if(e.cid==null)if(this._isReservedRemoteEvent(i))if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#removeAuthToken")t(null,e.data);else{let s=new d(`The reserved transmitted event ${i} is not supported`);t(s)}else this._processTransmitAction(e,r,t);else if(this._isReservedRemoteEvent(i))if(i==="#subscribe")this._processSubscribeAction(e,r,t);else if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#handshake"||i==="#authenticate"||i==="#unsubscribe")t(null,e.data);else{let s=new d(`The reserved invoked event ${i} is not supported`);t(s)}else this._processInvokeAction(e,r,t)}_isReservedRemoteEvent(e){return typeof e=="string"&&e.indexOf("#")===0}_handleServerError(e){typeof e=="string"&&(e=new B(e)),this.emitError(e)}_handleHandshakeTimeout(e){e.disconnect(4005)}async _handleSocketErrors(e){for await(let t of e.listener("error"))this.emitWarning(t.error)}async _subscribeSocket(e,t){if(!t)throw new d(`Socket ${e.id} provided a malformated channel payload`);if(this.socketChannelLimit&&e.channelSubscriptionsCount>=this.socketChannelLimit)throw new d(`Socket ${e.id} tried to exceed the channel subscription limit of ${this.socketChannelLimit}`);let r=t.channel;if(typeof r!="string")throw new d(`Socket ${e.id} provided an invalid channel name`);e.channelSubscriptionsCount==null&&(e.channelSubscriptionsCount=0),e.channelSubscriptions[r]==null&&(e.channelSubscriptions[r]=!0,e.channelSubscriptionsCount++);try{await this.brokerEngine.subscribeSocket(e,r)}catch(i){throw delete e.channelSubscriptions[r],e.channelSubscriptionsCount--,i}e.emit("subscribe",{channel:r,subscribeOptions:t}),this.emit("subscription",{socket:e,channel:r,subscribeOptions:t})}_unsubscribeSocketFromAllChannels(e){Object.keys(e.channelSubscriptions).forEach(t=>{this._unsubscribeSocket(e,t)})}_unsubscribeSocket(e,t){if(typeof t!="string")throw new d(`Socket ${e.id} tried to unsubscribe from an invalid channel name`);if(!e.channelSubscriptions[t])throw new d(`Socket ${e.id} tried to unsubscribe from a channel which it is not subscribed to`);delete e.channelSubscriptions[t],e.channelSubscriptionsCount!=null&&e.channelSubscriptionsCount--,this.brokerEngine.unsubscribeSocket(e,t),e.emit("unsubscribe",{channel:t}),this.emit("unsubscription",{socket:e,channel:t})}_processTokenError(e){let t=null,r=!0;return e&&(e.name==="TokenExpiredError"?t=new N(e.message,e.expiredAt):e.name==="JsonWebTokenError"?t=new j(e.message):e.name==="NotBeforeError"?(t=new H(e.message,e.date),r=!1):t=new x(e.message)),{authError:t,isBadToken:r}}_emitBadAuthTokenError(e,t,r){e.emit("badAuthToken",{authError:t,signedAuthToken:r}),this.emit("badSocketAuthToken",{socket:e,authError:t,signedAuthToken:r})}_processAuthToken(e,t,r){let i=Object.assign({socket:e},this.defaultVerificationOptions),s=c=>{let m=c.error,b=c.token,y=e.authState;if(b?(e.signedAuthToken=t,e.authToken=b,e.authState=e.AUTHENTICATED):(e.signedAuthToken=null,e.authToken=null,e.authState=e.UNAUTHENTICATED),e.authToken)this._passThroughAuthenticateMiddleware({socket:e,signedAuthToken:e.signedAuthToken,authToken:e.authToken},(l,h)=>{l&&(e.authToken=null,e.authState=e.UNAUTHENTICATED,h&&this._emitBadAuthTokenError(e,l,t)),r(l,h||!1,y)});else{let l=this._processTokenError(m);m&&t!=null&&(e.emitError(l.authError),l.isBadToken&&this._emitBadAuthTokenError(e,l.authError,t)),r(l.authError,l.isBadToken,y)}},a,o;try{a=this.auth.verifyToken(t,this.verificationKey,i)}catch(c){o=c}a instanceof Promise?(async()=>{let c={};try{c.token=await a}catch(m){c.error=m}s(c)})():s({token:a,error:o})}async _passThroughAuthenticateMiddleware(e,t){let r=!1,i={socket:e.socket,authToken:e.authToken};await C(this._middleware[this.MIDDLEWARE_AUTHENTICATE],i,(s,a)=>{if(r)this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_AUTHENTICATE} middleware was already invoked`));else{r=!0;let o=!1;a.length&&(o=a[a.length-1]||!1),s&&(s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_AUTHENTICATE} middleware`,this.MIDDLEWARE_AUTHENTICATE):this.middlewareEmitWarnings&&this.emitWarning(s)),t(s,o)}})}async _passThroughHandshakeAGMiddleware(e,t){let r=!1,i={socket:e.socket};await C(this._middleware[this.MIDDLEWARE_HANDSHAKE_AG],i,(s,a)=>{if(r)this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_HANDSHAKE_AG} middleware was already invoked`));else{r=!0;let o;a.length?o=a[a.length-1]||4008:o=4008,s&&(s.statusCode!=null&&(o=s.statusCode),s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_AG} middleware`,this.MIDDLEWARE_HANDSHAKE_AG):this.middlewareEmitWarnings&&this.emitWarning(s)),t(s,o)}})}_handleSocketConnection(e,t){!e.upgradeReq&&t&&(e.upgradeReq=t);let r=this.generateId(),i=new v(r,this,e);i.exchange=this.exchange,this._handleSocketErrors(i),this.pendingClients[r]=i,this.pendingClientsCount++,(async()=>{for await(let h of i.procedure("#authenticate")){let f=h.data;this._processAuthToken(i,f,(p,u,E)=>{if(p?u&&i.deauthenticate():i.triggerAuthenticationEvents(E),p&&u)h.error(p);else{let X={isAuthenticated:!!i.authToken,authError:Z(p)};h.end(X)}})}})(),(async()=>{for await(let h of i.receiver("#removeAuthToken"))i.deauthenticateSelf()})(),(async()=>{for await(let h of i.procedure("#subscribe")){let f=h.data;f?typeof f=="string"&&(f={channel:f}):f={},(async()=>{if(i.state===i.OPEN){try{await this._subscribeSocket(i,f)}catch(u){let E=new R(`Failed to subscribe socket to the ${f.channel} channel - ${u}`);h.error(E),i.emitError(E);return}if(f.batch){h.end(void 0,{batch:!0});return}h.end();return}let p=new d("Cannot subscribe socket to a channel before it has completed the handshake");h.error(p),this.emitWarning(p)})()}})(),(async()=>{for await(let h of i.procedure("#unsubscribe")){let f=h.data,p;try{this._unsubscribeSocket(i,f)}catch(u){p=new R(`Failed to unsubscribe socket from the ${f} channel - ${u}`)}p?(h.error(p),i.emitError(p)):h.end()}})();let m=(h,f,p)=>{clearTimeout(i._handshakeTimeoutRef),i.closeProcedure("#handshake"),i.closeProcedure("#authenticate"),i.closeProcedure("#subscribe"),i.closeProcedure("#unsubscribe"),i.closeReceiver("#removeAuthToken"),i.closeListener("authenticate"),i.closeListener("authStateChange"),i.closeListener("deauthenticate"),!!this.clients[r]&&(delete this.clients[r],this.clientsCount--),!!this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),h==="disconnect"?this.emit("disconnection",{socket:i,code:f,reason:p}):h==="abort"&&this.emit("connectionAbort",{socket:i,code:f,reason:p}),this.emit("closure",{socket:i,code:f,reason:p}),this._unsubscribeSocketFromAllChannels(i)};(async()=>{let h=await i.listener("disconnect").once();m("disconnect",h.code,h.data)})(),(async()=>{let h=await i.listener("connectAbort").once();m("abort",h.code,h.data)})(),i._handshakeTimeoutRef=setTimeout(this._handleHandshakeTimeout.bind(this,i),this.handshakeTimeout),(async()=>{for await(let h of i.procedure("#handshake")){let p=(h.data||{}).authToken||null;clearTimeout(i._handshakeTimeoutRef),this._passThroughHandshakeAGMiddleware({socket:i},(u,E)=>{if(u){u.statusCode==null&&(u.statusCode=E),h.error(u),i.disconnect(u.statusCode);return}this._processAuthToken(i,p,(X,Ue,$e)=>{if(i.state===i.CLOSED)return;let Y={id:i.id,pingTimeout:this.pingTimeout},ie={id:i.id,pingTimeout:this.pingTimeout};X&&p!=null&&(Y.authError=Z(X),ie.authError=X,Ue&&i.deauthenticate()),Y.isAuthenticated=!!i.authToken,ie.isAuthenticated=Y.isAuthenticated,this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),this.clients[r]=i,this.clientsCount++,i.state=i.OPEN,Y.isAuthenticated&&(async()=>(await this.listener("connection").once(),i.triggerAuthenticationEvents($e)))(),i.emit("connect",ie),this.emit("connection",{socket:i,...ie}),h.end(Y)})})}})(),this.emit("handshake",{socket:i})}};function He(n,e){return e=e||{},e.httpServer=n,new z(e)}function kt(n,e,t){if(typeof e=="function"&&(t=e,e={}),A()){let i=de("http").createServer(),s=He(i,e);return s.httpServer=i,s.httpServer.listen(n,t),s}else return new z(e)}return Ye(wt);})();
var TopGunSocket=(()=>{var Ke=Object.create;var Q=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ve=Object.getOwnPropertyNames;var Ge=Object.getPrototypeOf,Je=Object.prototype.hasOwnProperty;var qe=(n,e,t)=>e in n?Q(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var de=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+n+'" is not supported')});var ze=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),pe=(n,e)=>{for(var t in e)Q(n,t,{get:e[t],enumerable:!0})},be=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ve(e))!Je.call(n,i)&&i!==t&&Q(n,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return n};var Xe=(n,e,t)=>(t=n!=null?Ke(Ge(n)):{},be(e||!n||!n.__esModule?Q(t,"default",{value:n,enumerable:!0}):t,n)),Ye=n=>be(Q({},"__esModule",{value:!0}),n);var w=(n,e,t)=>(qe(n,typeof e!="symbol"?e+"":e,t),t);var Ae=ze((Vt,Te)=>{var V=1e3,G=V*60,J=G*60,W=J*24,it=W*7,nt=W*365.25;Te.exports=function(n,e){e=e||{};var t=typeof n;if(t==="string"&&n.length>0)return st(n);if(t==="number"&&isFinite(n))return e.long?ot(n):at(n);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(n))};function st(n){if(n=String(n),!(n.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(n);if(!!e){var t=parseFloat(e[1]),r=(e[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return t*nt;case"weeks":case"week":case"w":return t*it;case"days":case"day":case"d":return t*W;case"hours":case"hour":case"hrs":case"hr":case"h":return t*J;case"minutes":case"minute":case"mins":case"min":case"m":return t*G;case"seconds":case"second":case"secs":case"sec":case"s":return t*V;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function at(n){var e=Math.abs(n);return e>=W?Math.round(n/W)+"d":e>=J?Math.round(n/J)+"h":e>=G?Math.round(n/G)+"m":e>=V?Math.round(n/V)+"s":n+"ms"}function ot(n){var e=Math.abs(n);return e>=W?ae(n,e,W,"day"):e>=J?ae(n,e,J,"hour"):e>=G?ae(n,e,G,"minute"):e>=V?ae(n,e,V,"second"):n+" ms"}function ae(n,e,t,r){var i=e>=t*1.5;return Math.round(n/t)+" "+r+(i?"s":"")}});var wt={};pe(wt,{TGSocket:()=>v,TGSocketServer:()=>z,attach:()=>He,listen:()=>kt});var O=class{next(e){return this.createAsyncIterator(e).next()}async once(e){let t=await this.next(e);return t.done&&await new Promise(()=>{}),t.value}createAsyncIterator(e){throw new TypeError("Method must be overriden by subclass")}createAsyncIterable(e){return{[Symbol.asyncIterator]:()=>this.createAsyncIterator(e)}}[Symbol.asyncIterator](){return this.createAsyncIterator()}};var ne=class extends O{name;_streamDemux;constructor(e,t){super(),this.name=t,this._streamDemux=e}createAsyncIterator(e){return this._streamDemux.createAsyncIterator(this.name,e)}};var se=class extends O{_nextConsumerId;_consumers;_linkedListTailNode;constructor(){super(),this._nextConsumerId=1,this._consumers={},this._linkedListTailNode={next:null}}write(e){this._write(e,!1)}close(){this._write(void 0,!0)}async _waitForNextDataNode(e){return new Promise((t,r)=>{let i,s=this._nextConsumerId++;if(e!==void 0){let a=new Error("Stream consumer iteration timed out");(async()=>{let o=Qe(e);i=o.timeoutId,await o.promise,a.name="TimeoutError",delete this._consumers[s],r(a)})()}this._consumers[s]={resolve:t,timeoutId:i}})}createAsyncIterator(e){let t=this._linkedListTailNode;return{next:async()=>(t.next||await this._waitForNextDataNode(e),t=t.next,t.data)}}_write(e,t){let r={data:{value:e,done:t},next:null};this._linkedListTailNode.next=r,this._linkedListTailNode=r,Object.values(this._consumers).forEach(i=>{i.timeoutId!==void 0&&clearTimeout(i.timeoutId),i.resolve()}),this._consumers={},this._nextConsumerId=1}};function Qe(n=0){let e,t=new Promise(r=>{e=setTimeout(r,n)});return{timeoutId:e,promise:t}}var _=class{_mainStream;constructor(){this._mainStream=new se}write(e,t){this._write(e,t,!1)}close(e,t){this._write(e,t,!0)}closeAll(){this._mainStream.close()}createAsyncIterator(e,t){let r=this._mainStream.createAsyncIterator(t);return{next:async()=>{for(;;){let i=await r.next();if(i.done)return i;if(i.value.name===e)return i.value.data}}}}stream(e){return new ne(this,e)}_write(e,t,r){this._mainStream.write({name:e,data:{value:t,done:r}})}};var D=class{_listenerDemux;constructor(){this._listenerDemux=new _}emit(e,t){this._listenerDemux.write(e,t)}listener(e){return this._listenerDemux.stream(e)}closeListener(e){this._listenerDemux.close(e)}closeAllListeners(){this._listenerDemux.closeAll()}};function ye(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{let e=Math.random()*16|0;return(n==="x"?e:e&3|8).toString(16)})}function ge(){return Math.abs(Math.random()*Math.random()*Date.now()|0).toString()+Math.abs(Math.random()*Math.random()*Date.now()|0).toString()}function Ee(n){let e=[],t=[];return function r(i,s){let a,o,c;if(typeof i=="object"&&i!==null&&!(i instanceof Boolean)&&!(i instanceof Date)&&!(i instanceof Number)&&!(i instanceof RegExp)&&!(i instanceof String)){for(a=0;a<e.length;a+=1)if(e[a]===i)return{$ref:t[a]};if(e.push(i),t.push(s),Object.prototype.toString.apply(i)==="[object Array]")for(c=[],a=0;a<i.length;a+=1)c[a]=r(i[a],s+"["+a+"]");else{c={};for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(c[o]=r(i[o],s+"["+JSON.stringify(o)+"]"))}return c}return i}(n,"$")}function k(){"use strict";return typeof function(){return this}()>"u"}var N=class extends Error{expiry;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,N.prototype),this.name="AuthTokenExpiredError",this.message=e,this.expiry=new Date(t),Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},j=class extends Error{isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,j.prototype),this.name="AuthTokenInvalidError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},H=class extends Error{date;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,H.prototype),this.name="AuthTokenNotBeforeError",this.message=e,this.date=t,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},x=class extends Error{expiredAt;date;isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,x.prototype),this.name="AuthTokenError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},U=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,U.prototype),this.name="AuthError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},S=class extends Error{type;constructor(e,t){super(e),Object.setPrototypeOf(this,S.prototype),this.name="SilentMiddlewareBlockedError",this.message=e,this.type=t,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},d=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,d.prototype),this.name="InvalidActionError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},T=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,T.prototype),this.name="InvalidArgumentsError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},P=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,P.prototype),this.name="InvalidOptionsError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var $=class extends Error{code;constructor(e,t){super(e),Object.setPrototypeOf(this,$.prototype),this.name="SocketProtocolError",this.message=e,this.code=t,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},B=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,B.prototype),this.name="ServerProtocolError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var K=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,K.prototype),this.name="TimeoutError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var R=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,R.prototype),this.name="BrokerError",this.message=e,Error.captureStackTrace&&!k()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var Se={1001:"Socket was disconnected",1002:"A WebSocket protocol error was encountered",1003:"Server terminated socket because it received invalid data",1005:"Socket closed without status code",1006:"Socket hung up",1007:"Message format was incorrect",1008:"Encountered a policy violation",1009:"Message was too big to process",1010:"Client ended the connection because the server did not comply with extension requirements",1011:"Server encountered an unexpected fatal condition",4e3:"Server ping timed out",4001:"Client pong timed out",4002:"Server failed to sign auth token",4003:"Failed to complete handshake",4004:"Client failed to save auth token",4005:"Did not receive #handshake from client before timeout",4006:"Failed to bind socket to message broker",4007:"Client connection establishment timed out",4008:"Server rejected handshake from client",4009:"Server received a message before the client handshake"},ke={1e3:"Socket closed normally",1001:"Socket hung up"},Ze={domain:1,domainEmitter:1,domainThrown:1};function Z(n,e){let t;if(n&&typeof n=="object"){t={message:n.message},e&&(t.stack=n.stack);for(let r in n)Ze[r]||(t[r]=n[r])}else typeof n=="function"?t="[function "+(n.name||"anonymous")+"]":t=n;return Ee(t)}function we(n){let e=null;if(n!=null)if(typeof n=="object"){e=new Error(n.message);for(let t in n)n.hasOwnProperty(t)&&(e[t]=n[t])}else e=n;return e}var et=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];function tt(n){let e=0,t="",r=new Uint8Array(n);for(;e<r.length;e++)t+=et[r[e]];return t}function ve(n=9){let e=new Uint8Array(n);try{return tt(e)}catch{return null}}var rt=crypto,F=rt;var Ne=Xe(Ae(),1);function _e(n){switch(n.length%4){case 0:break;case 2:n+="==";break;case 3:n+="=";break;default:throw new Error("Illegal base64url string!")}try{return JSON.parse(decodeURIComponent(escape(atob(n))))}catch{return null}}function ct(n){return{header:_e(n.split(".")[0].replace(/-/g,"+").replace(/_/g,"/")),payload:_e(n.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"))}}function Ce(n){return new Uint8Array(Array.prototype.map.call(atob(n.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"")),e=>e.charCodeAt(0)))}function q(n){return Ce(btoa(unescape(encodeURIComponent(n))))}function Oe(n){n=atob(n);let e=new ArrayBuffer(n.length),t=new Uint8Array(e);for(let r=0,i=n.length;r<i;r++)t[r]=n.charCodeAt(r);return e}var Pe={ES256:{name:"ECDSA",namedCurve:"P-256",hash:{name:"SHA-256"}},ES384:{name:"ECDSA",namedCurve:"P-384",hash:{name:"SHA-384"}},ES512:{name:"ECDSA",namedCurve:"P-521",hash:{name:"SHA-512"}},HS256:{name:"HMAC",hash:{name:"SHA-256"}},HS384:{name:"HMAC",hash:{name:"SHA-384"}},HS512:{name:"HMAC",hash:{name:"SHA-512"}},RS256:{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},RS384:{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-384"}},RS512:{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-512"}}};async function Re(n,e,t={algorithm:"HS256",throwError:!1},r){typeof t=="string"&&(t={algorithm:t,throwError:!1}),t={algorithm:"HS256",throwError:!1,...t};function i(l){if(r)return r(null,l);throw l}typeof n!="string"&&i(new Error("AuthTokenInvalidError")),typeof e!="string"&&typeof e!="object"&&i(new Error("secret must be a string or a JWK object")),typeof t.algorithm!="string"&&i(new Error("options.algorithm must be a string"));let s=n.split(".");s.length!==3&&i(new Error("token must consist of 3 parts"));let a=Pe[t.algorithm];a||i(new Error("algorithm not found"));let{payload:o}=ct(n);if(!o)return t.throwError&&i(new Error("ParseError")),!1;if(o.nbf&&o.nbf>Math.floor(Date.now()/1e3))return t.throwError&&i(new Error("NotYetValid")),!1;if(o.exp&&o.exp<=Math.floor(Date.now()/1e3))return t.throwError&&i(new Error("TokenExpiredError")),!1;let c="raw",m;typeof e=="object"?(c="jwk",m=e):typeof e=="string"&&e.startsWith("-----BEGIN")?(c="spki",m=Oe(e.replace(/-----BEGIN.*?-----/g,"").replace(/-----END.*?-----/g,"").replace(/\s/g,""))):m=q(e);let b=await F.subtle.importKey(c,m,a,!1,["verify"]),y=await F.subtle.verify(a,b,Ce(s[2]),q(`${s[0]}.${s[1]}`))?o:!1;return typeof r=="function"&&r(null,y),y}function L(n){return typeof n=="string"}function ee(n){return typeof n=="number"}function De(n){return typeof n=="boolean"}function Me(n){if(typeof n!="object"||n===null)return!1;let e=Object.getPrototypeOf(n);return e===null||e===Object.prototype}function xe(n,e){let t=e||Math.floor(Date.now()/1e3);if(typeof n=="string"){let r=(0,Ne.default)(n);return typeof r>"u"?void 0:Math.floor(t+r/1e3)}else return typeof n=="number"?t+n:void 0}function me(n){return btoa(String.fromCharCode.apply(0,Array.from(n))).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var ht=["ES256","ES384","ES512","HS256","HS384","HS512","RS256","RS384","RS512","none"],lt={expiresIn:{isValid:n=>ee(n)||L(n)&&n,message:'"expiresIn" should be a number of seconds or string representing a timespan'},notBefore:{isValid:n=>ee(n)||L(n)&&n,message:'"notBefore" should be a number of seconds or string representing a timespan'},audience:{isValid:n=>L(n)||Array.isArray(n),message:'"audience" must be a string or array'},algorithm:{isValid:n=>ht.includes(n),message:'"algorithm" must be a valid string enum value'},header:{isValid:Me,message:'"header" must be an object'},issuer:{isValid:L,message:'"issuer" must be a string'},subject:{isValid:L,message:'"subject" must be a string'},jwtid:{isValid:L,message:'"jwtid" must be a string'},noTimestamp:{isValid:De,message:'"noTimestamp" must be a boolean'},keyid:{isValid:L,message:'"keyid" must be a string'},mutatePayload:{isValid:De,message:'"mutatePayload" must be a boolean'}},ut={iat:{isValid:ee,message:'"iat" should be a number of seconds'},exp:{isValid:ee,message:'"exp" should be a number of seconds'},nbf:{isValid:ee,message:'"nbf" should be a number of seconds'}};function Be(n,e,t,r){if(!Me(t))throw new Error('Expected "'+r+'" to be a plain object.');Object.keys(t).forEach(function(i){let s=n[i];if(!s){if(!e)throw new Error('"'+i+'" is not allowed in "'+r+'"');return}if(!s.isValid(t[i]))throw new Error(s.message)})}function dt(n){return Be(lt,!1,n,"options")}function mt(n){return Be(ut,!0,n,"payload")}var Ie={audience:"aud",issuer:"iss",subject:"sub",jwtid:"jti"},ft=["expiresIn","notBefore","noTimestamp","audience","issuer","subject","jwtid"];async function We(n,e,t,r){typeof t=="function"?(r=t,t={}):t=t||{},t={algorithm:"HS256",...t};let i=typeof n=="object",s=Object.assign({alg:t.algorithm,typ:i?"JWT":void 0},t.header);function a(u){if(r)return r(u);throw u}if(!e&&t.algorithm!=="none"&&a(new Error("secretOrPrivateKey must have a value")),typeof n>"u")a(new Error("payload is required"));else if(i){try{mt(n)}catch(u){a(u)}t.mutatePayload||(n=Object.assign({},n))}else{let u=ft.filter(function(E){return typeof t[E]<"u"});u.length>0&&a(new Error("invalid "+u.join(",")+" option for "+typeof n+" payload"))}typeof n.exp<"u"&&typeof t.expiresIn<"u"&&a(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.')),typeof n.nbf<"u"&&typeof t.notBefore<"u"&&a(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));try{dt(t)}catch(u){a(u)}let o=n.iat||Math.floor(Date.now()/1e3);if(t.noTimestamp?delete n.iat:i&&(n.iat=o),typeof t.notBefore<"u"){try{n.nbf=xe(t.notBefore,o)}catch(u){a(u)}typeof n.nbf>"u"&&a(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}if(typeof t.expiresIn<"u"&&typeof n=="object"){try{n.exp=xe(t.expiresIn,o)}catch(u){a(u)}typeof n.exp>"u"&&a(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}Object.keys(Ie).forEach(function(u){let E=Ie[u];if(typeof t[u]<"u"){if(typeof n[E]<"u")return a(new Error('Bad "options.'+u+'" option. The payload already has an "'+E+'" property.'));n[E]=t[u]}});let c=JSON.stringify(n),m=`${me(q(JSON.stringify({...s})))}.${me(q(c))}`,b="raw",y;typeof e=="object"?(b="jwk",y=e):typeof e=="string"&&e.startsWith("-----BEGIN")?(b="pkcs8",y=Oe(e.replace(/-----BEGIN.*?-----/g,"").replace(/-----END.*?-----/g,"").replace(/\s/g,""))):y=q(e);let l=Pe[t.algorithm];l||a(new Error("algorithm not found"));let h=await F.subtle.importKey(b,y,l,!1,["sign"]),f=await F.subtle.sign(l,h,q(m)),p=`${m}.${me(new Uint8Array(f))}`;return typeof r=="function"&&r(null,p),p}var oe=class{verifyToken(e,t,r){r=r||{};let i=Object.assign({},r);return delete i.socket,typeof e=="string"||e==null?new Promise((s,a)=>{Re(e,t,i).then(o=>{o?s(o):a(new x("Invalid token"))}).catch(o=>a(o))}):Promise.reject(new T("Invalid token format - Token must be a string"))}signToken(e,t,r){r=r||{};let i=Object.assign({},r);return new Promise((s,a)=>{We(e,t,i).then(o=>{o?s(o):a(new x("Sign token error"))}).catch(o=>a(o))})}};var fe={};pe(fe,{decode:()=>gt,encode:()=>Et});var M=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global||void 0;function A(){return typeof process=="object"}var ce="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",pt=/^[ \n\r\t]*[{\[]/,bt=n=>{let e=new Uint8Array(n),t=e.length,r="";for(let i=0;i<t;i+=3)r+=ce[e[i]>>2],r+=ce[(e[i]&3)<<4|e[i+1]>>4],r+=ce[(e[i+1]&15)<<2|e[i+2]>>6],r+=ce[e[i+2]&63];return t%3===2?r=r.substring(0,r.length-1)+"=":t%3===1&&(r=r.substring(0,r.length-2)+"=="),r},yt=(n,e)=>{if(M.ArrayBuffer&&e instanceof M.ArrayBuffer)return{base64:!0,data:bt(e)};if(M.Buffer){if(e instanceof M.Buffer)return{base64:!0,data:e.toString("base64")};if(e&&e.type==="Buffer"&&Array.isArray(e.data)){let t;return M.Buffer.from?t=M.Buffer.from(e.data):t=new M.Buffer(e.data),{base64:!0,data:t.toString("base64")}}}return e};function gt(n){if(n===null)return null;if(n==="#1"||n==="#2")return n;let e=n.toString();if(!pt.test(e))return e;try{return JSON.parse(e)}catch{}return e}function Et(n){return n==="#1"||n==="#2"?n:A()?JSON.stringify(n,yt):JSON.stringify(n)}var he=class{socket;id;sent;constructor(e,t){this.socket=e,this.id=t,this.sent=!1}end(e,t){if(this.id){let r={rid:this.id};e!==void 0&&(r.data=e),this._respond(r,t)}}error(e,t,r){if(this.id){let i=Z(e),s={rid:this.id,error:i};t!==void 0&&(s.data=t),this._respond(s,r)}}callback(e,t,r){e?this.error(e,t,r):this.end(t,r)}_respond(e,t){if(this.sent)throw new d(`Response ${this.id} has already been sent`);this.sent=!0,this.socket.sendObject(e,t)}};function Le(n){return Object.prototype.toString.call(n)==="[object Date]"}function je(n){return!!n&&typeof n=="object"&&Object.prototype.toString.call(n)!=="[object Array]"}function te(n){if(Le(n))return new Date(n.getTime());if(Array.isArray(n))return[...n].map(e=>te(e));if(n instanceof Map||n instanceof Set)return n;if(je(n)){let e={};for(let t of Object.keys(n))e[t]=te(n[t]);return e}return n}var I=class extends D{id;server;socket;state;authState;request;remoteAddress;remoteFamily;remotePort;forwardedForAddress;channelSubscriptions;channelSubscriptionsCount;authToken;signedAuthToken;exchange;_handshakeTimeoutRef;CONNECTING=I.CONNECTING;OPEN=I.OPEN;CLOSED=I.CLOSED;AUTHENTICATED=I.AUTHENTICATED;UNAUTHENTICATED=I.UNAUTHENTICATED;_autoAckRPCs;_callbackMap;_pingIntervalTicker;_receiverDemux;_procedureDemux;_cid;_batchSendList;_pingTimeoutTicker;_batchTimeout;constructor(e,t,r){super(),this._autoAckRPCs={"#publish":1},this.id=e,this.server=t,this.socket=r,this.state=this.CONNECTING,this.authState=this.UNAUTHENTICATED,this._receiverDemux=new _,this._procedureDemux=new _,this.request=this.socket.upgradeReq||{},this.request.connection?(this.remoteAddress=this.request.connection.remoteAddress,this.remoteFamily=this.request.connection.remoteFamily,this.remotePort=this.request.connection.remotePort):(this.remoteAddress=this.request.remoteAddress,this.remoteFamily=this.request.remoteFamily,this.remotePort=this.request.remotePort),this.request.forwardedForAddress&&(this.forwardedForAddress=this.request.forwardedForAddress),this._cid=1,this._callbackMap={},this._batchSendList=[],this.channelSubscriptions={},this.channelSubscriptionsCount=0,this._on("error",async i=>{this.emitError(i)}),this._on("close",async(i,s)=>{let a=s&&s.toString();this._onClose(i,a)}),this.server.pingTimeoutDisabled||(this._pingIntervalTicker=setInterval(this._sendPing.bind(this),this.server.pingInterval)),this._resetPongTimeout(),this._on("message",async i=>{let s=A()?i:i.data;this._resetPongTimeout(),this.emit("message",{message:s});let a;try{a=this.decode(s)}catch(o){o.name==="Error"&&(o.name="InvalidMessageError"),this.emitError(o);return}if(a==="#2"){let o=this.getAuthToken();this.server.isAuthTokenExpired(o)&&this.deauthenticate()}else if(Array.isArray(a)){let o=a.length;for(let c=0;c<o;c++)this._handleRemoteEventObject(a[c],s)}else this._handleRemoteEventObject(a,s)})}receiver(e){return this._receiverDemux.stream(e)}closeReceiver(e){this._receiverDemux.close(e)}procedure(e){return this._procedureDemux.stream(e)}closeProcedure(e){this._procedureDemux.close(e)}getState(){return this.state}getBytesReceived(){return this.socket?.bytesReceived}emitError(e){this.emit("error",{error:e})}disconnect(e,t){if(e=e||1e3,typeof e!="number"){let r=new T("If specified, the code argument must be a number");this.emitError(r)}this.state!==this.CLOSED&&(this._onClose(e,t),this.socket.close(e,t))}terminate(){this.socket.terminate()}send(e,t){A()?this.socket.send(e,t,r=>{r&&this._onClose(1006,r.toString())}):this.socket.send(e)}decode(e){return this.server.codec.decode(e)}encode(e){return this.server.codec.encode(e)}sendObjectBatch(e){this._batchSendList.push(e),!this._batchTimeout&&(this._batchTimeout=setTimeout(()=>{if(delete this._batchTimeout,this._batchSendList.length){let t;try{t=this.encode(this._batchSendList)}catch(r){this.emitError(r)}t!=null&&this.send(t),this._batchSendList=[]}},this.server.options.pubSubBatchDuration||0))}sendObjectSingle(e){let t;try{t=this.encode(e)}catch(r){this.emitError(r)}t!=null&&this.send(t)}sendObject(e,t){t&&t.batch?this.sendObjectBatch(e):this.sendObjectSingle(e)}transmit(e,t,r){return this.server.verifyOutboundEvent(this,e,t,r,(i,s)=>{let a={event:e};s!==void 0&&(a.data=s),i||(r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(a))}),Promise.resolve()}invoke(e,t,r){return new Promise((i,s)=>{this.server.verifyOutboundEvent(this,e,t,r,(a,o)=>{if(a){s(a);return}let c={event:e,cid:this._nextCallId()};o!==void 0&&(c.data=o);let m=setTimeout(()=>{let b=new K(`Event response for "${e}" timed out`);delete this._callbackMap[c.cid],s(b)},this.server.ackTimeout);this._callbackMap[c.cid]={callback:(b,y)=>{if(b){s(b);return}i(y)},timeout:m},r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(c)})})}triggerAuthenticationEvents(e){if(e!==this.AUTHENTICATED){let t={oldAuthState:e,newAuthState:this.authState,authToken:this.authToken};this.emit("authStateChange",t),this.server.emit("authenticationStateChange",{socket:this,...t})}this.emit("authenticate",{authToken:this.authToken}),this.server.emit("authentication",{socket:this,authToken:this.authToken})}async setAuthToken(e,t){let r=te(e),i=this.authState;if(this.authState=this.AUTHENTICATED,t==null)t={};else if(t=te(t),t.algorithm!=null){delete t.algorithm;let l=new T("Cannot change auth token algorithm at runtime - It must be specified as a config option on launch");this.emitError(l)}t.mutatePayload=!0;let s=t.rejectOnFailedDelivery;delete t.rejectOnFailedDelivery;let a=this.server.defaultSignatureOptions,o;t.expiresIn==null?o=a.expiresIn:o=t.expiresIn,r?r.exp==null?t.expiresIn=o:delete t.expiresIn:t.expiresIn=o,a.algorithm!=null&&(t.algorithm=a.algorithm),this.authToken=r;let c=l=>{throw this.emitError(l),this._onClose(4002,l.toString()),this.socket.close(4002),l},m=async l=>{let h={token:l};try{return await this.invoke("#setAuthToken",h)}catch(f){throw new U(`Failed to deliver auth token to client - ${f}`)}},b;try{b=this.server.auth.signToken(r,this.server.signatureKey,t)}catch(l){c(l)}let y;if(b instanceof Promise)try{y=await b}catch(l){c(l)}else y=b;this.authToken===r&&(this.signedAuthToken=y,this.emit("authTokenSigned",{signedAuthToken:y})),this.triggerAuthenticationEvents(i);try{await m(y)}catch(l){if(this.emitError(l),s)throw l}}getAuthToken(){return this.authToken}deauthenticateSelf(){let e=this.authState,t=this.authToken;if(this.signedAuthToken=null,this.authToken=null,this.authState=this.UNAUTHENTICATED,e!==this.UNAUTHENTICATED){let r={oldAuthState:e,newAuthState:this.authState};this.emit("authStateChange",r),this.server.emit("authenticationStateChange",{socket:this,...r})}this.emit("deauthenticate",{oldAuthToken:t}),this.server.emit("deauthentication",{socket:this,oldAuthToken:t})}deauthenticate(){return this.deauthenticateSelf(),this.invoke("#removeAuthToken")}kickOut(e,t){return e==null?Object.keys(this.channelSubscriptions).forEach(r=>{delete this.channelSubscriptions[r],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:r})}):(delete this.channelSubscriptions[e],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:e})),this.server.brokerEngine.unsubscribeSocket(this,e)}subscriptions(){return Object.keys(this.channelSubscriptions)}isSubscribed(e){return!!this.channelSubscriptions[e]}_onClose(e,t){if(clearInterval(this._pingIntervalTicker),clearTimeout(this._pingTimeoutTicker),this.state!==this.CLOSED){let r=this.state;if(this.state=this.CLOSED,r===this.CONNECTING?this.emit("connectAbort",{code:e,reason:t}):this.emit("disconnect",{code:e,reason:t}),this.emit("close",{code:e,reason:t}),!I.ignoreStatuses[e]){let i;if(t){let a;if(typeof t=="object")try{a=JSON.stringify(t)}catch{a=t.toString()}else a=t;i=`Socket connection closed with status code ${e} and reason: ${a}`}else i=`Socket connection closed with status code ${e}`;let s=new $(I.errorStatuses[e]||i,e);this.emitError(s)}}}_sendPing(){this.state!==this.CLOSED&&this.sendObject("#1")}_handleRemoteEventObject(e,t){if(e&&e.event!=null){let r=e.event,i={socket:this,event:r,data:e.data};if(e.cid==null)this.server.verifyInboundRemoteEvent(i,(s,a)=>{s||this._receiverDemux.write(r,a)});else{i.cid=e.cid;let s=new he(this,i.cid);this.server.verifyInboundRemoteEvent(i,(a,o,c)=>{a?s.error(a):this._autoAckRPCs[r]?c!==void 0?s.end(c):s.end():this._procedureDemux.write(r,{data:o,end:m=>{s.end(m)},error:m=>{s.error(m)}})})}}else if(e&&e.rid!=null){let r=this._callbackMap[e.rid];if(r){clearTimeout(r.timeout),delete this._callbackMap[e.rid];let i=we(e.error);r.callback(i,e.data)}}else this.emit("raw",{message:t})}_resetPongTimeout(){this.server.pingTimeoutDisabled||(clearTimeout(this._pingTimeoutTicker),this._pingTimeoutTicker=setTimeout(()=>{this._onClose(4001),this.socket.close(4001)},this.server.pingTimeout))}_nextCallId(){return this._cid++}_on(e,t){A()?this.socket.on(e,t):this.socket.addEventListener(e,t)}},v=I;w(v,"CONNECTING","connecting"),w(v,"OPEN","open"),w(v,"CLOSED","closed"),w(v,"AUTHENTICATED","authenticated"),w(v,"UNAUTHENTICATED","unauthenticated"),w(v,"ignoreStatuses",ke),w(v,"errorStatuses",Se);async function St(n,e){for(let t=0;t<n.length;t++)await e(n[t],t,n)}async function C(n,...e){let t=typeof e[e.length-1]=="function"?e.pop():()=>{},r=null,i=[];return await St(n,async s=>{if(!r)try{let a=await s(...e);i.push(a)}catch(a){i.push(void 0),r=a}}),t(r,i),i}var re=class extends O{PENDING;SUBSCRIBED;UNSUBSCRIBED;name;client;_pendingSubscriptionCid;_eventDemux;_dataStream;constructor(e,t,r,i){super(),this.PENDING=re.PENDING,this.SUBSCRIBED=re.SUBSCRIBED,this.UNSUBSCRIBED=re.UNSUBSCRIBED,this.name=e,this.client=t,this._eventDemux=r,this._dataStream=i}get state(){return this.client.getChannelState(this.name)}set state(e){throw new Error("Cannot directly set channel state")}get options(){return this.client.getChannelOptions(this.name)}set options(e){throw new Error("Cannot directly set channel options")}createAsyncIterator(e){return this._dataStream.createAsyncIterator(e)}listener(e){return this._eventDemux.stream(`${this.name}/${e}`)}closeListener(e){this._eventDemux.close(`${this.name}/${e}`)}closeAllListeners(){this._eventDemux.closeAll()}close(){this.client.closeChannel(this.name)}subscribe(e){this.client.subscribe(this.name,e)}unsubscribe(){this.client.unsubscribe(this.name)}isSubscribed(e){return this.client.isSubscribed(this.name,e)}publish(e){return this.client.publish(this.name,e)}},g=re;w(g,"PENDING","pending"),w(g,"SUBSCRIBED","subscribed"),w(g,"UNSUBSCRIBED","unsubscribed");var le=class extends D{_broker;_channelMap;_channelEventDemux;_channelDataDemux;constructor(e){super(),this._broker=e,this._channelMap={},this._channelEventDemux=new _,this._channelDataDemux=new _,(async()=>{for await(let{channel:t,data:r}of this._broker.listener("publish"))this._channelDataDemux.write(t,r)})()}destroy(){this._broker.closeAllListeners()}publish(e,t){return this._broker.publish(e,t)}subscribe(e){let t=this._channelMap[e];t||(t={name:e,state:g.PENDING},this._channelMap[e]=t,this._triggerChannelSubscribe(t));let r=this._channelDataDemux.stream(e);return new g(e,this,this._channelEventDemux,r)}unsubscribe(e){let t=this._channelMap[e];t&&this._triggerChannelUnsubscribe(t)}channel(e){let t=this._channelDataDemux.stream(e);return new g(e,this,this._channelEventDemux,t)}getChannelState(e){let t=this._channelMap[e];return t?t.state:g.UNSUBSCRIBED}getChannelOptions(e){return{}}subscriptions(e){let t=[];return Object.keys(this._channelMap).forEach(r=>{(e||this._channelMap[r].state===g.SUBSCRIBED)&&t.push(r)}),t}isSubscribed(e,t){let r=this._channelMap[e];return t?!!r:!!r&&r.state===g.SUBSCRIBED}_triggerChannelSubscribe(e){let t=e.name;e.state=g.SUBSCRIBED,this._channelEventDemux.write(`${t}/subscribe`,{}),this.emit("subscribe",{channel:t})}_triggerChannelUnsubscribe(e){let t=e.name;delete this._channelMap[t],e.state===g.SUBSCRIBED&&(this._channelEventDemux.write(`${t}/unsubscribe`,{}),this.emit("unsubscribe",{channel:t}))}};var ue=class extends D{isReady;_exchangeClient;_clientSubscribers;_clientSubscribersCounter;constructor(){super(),this.isReady=!1,this._exchangeClient=new le(this),this._clientSubscribers={},this._clientSubscribersCounter={},setTimeout(()=>{this.isReady=!0,this.emit("ready",{})},0)}exchange(){return this._exchangeClient}subscribeSocket(e,t){return this._clientSubscribers[t]||(this._clientSubscribers[t]={},this._clientSubscribersCounter[t]=0),this._clientSubscribers[t][e.id]||(this._clientSubscribersCounter[t]++,this.emit("subscribe",{channel:t})),this._clientSubscribers[t][e.id]=e,Promise.resolve()}unsubscribeSocket(e,t){return this._clientSubscribers[t]&&this._clientSubscribers[t][e.id]&&(this._clientSubscribersCounter[t]--,delete this._clientSubscribers[t][e.id],this._clientSubscribersCounter[t]<=0&&(delete this._clientSubscribers[t],delete this._clientSubscribersCounter[t],this.emit("unsubscribe",{channel:t}))),Promise.resolve()}subscriptions(){return Object.keys(this._clientSubscribers)}isSubscribed(e){return!!this._clientSubscribers[e]}publish(e,t,r){let i={channel:e,data:t},s=this._clientSubscribers[e]||{};return Object.keys(s).forEach(a=>{s[a].transmit("#publish",i)}),r||this.emit("publish",i),Promise.resolve()}};var z=class extends D{options;MIDDLEWARE_HANDSHAKE_WS;MIDDLEWARE_HANDSHAKE_AG;MIDDLEWARE_TRANSMIT;MIDDLEWARE_INVOKE;MIDDLEWARE_SUBSCRIBE;MIDDLEWARE_PUBLISH_IN;MIDDLEWARE_PUBLISH_OUT;MIDDLEWARE_AUTHENTICATE;origins;ackTimeout;handshakeTimeout;pingInterval;pingTimeout;pingTimeoutDisabled;allowClientPublish;perMessageDeflate;httpServer;socketChannelLimit;brokerEngine;appName;middlewareEmitWarnings;isReady;signatureKey;verificationKey;authVerifyAsync;authSignAsync;defaultVerificationOptions;defaultSignatureOptions;auth;codec;clients;clientsCount;pendingClients;pendingClientsCount;exchange;_middleware;_allowAllOrigins;wsServer;_path;constructor(e){super();let t={brokerEngine:new ue,wsEngine:"ws",wsEngineServerOptions:{},maxPayload:null,allowClientPublish:!0,ackTimeout:1e4,handshakeTimeout:1e4,pingTimeout:2e4,pingTimeoutDisabled:!1,pingInterval:8e3,origins:"*:*",appName:ye(),path:"/topgunsocket/",authDefaultExpiry:86400,authSignAsync:!1,authVerifyAsync:!0,pubSubBatchDuration:null,middlewareEmitWarnings:!0};this.options=Object.assign(t,e||{}),this.MIDDLEWARE_HANDSHAKE_WS="handshakeWS",this.MIDDLEWARE_HANDSHAKE_AG="handshakeAG",this.MIDDLEWARE_TRANSMIT="transmit",this.MIDDLEWARE_INVOKE="invoke",this.MIDDLEWARE_SUBSCRIBE="subscribe",this.MIDDLEWARE_PUBLISH_IN="publishIn",this.MIDDLEWARE_PUBLISH_OUT="publishOut",this.MIDDLEWARE_AUTHENTICATE="authenticate",this._middleware={},this._middleware[this.MIDDLEWARE_HANDSHAKE_WS]=[],this._middleware[this.MIDDLEWARE_HANDSHAKE_AG]=[],this._middleware[this.MIDDLEWARE_TRANSMIT]=[],this._middleware[this.MIDDLEWARE_INVOKE]=[],this._middleware[this.MIDDLEWARE_SUBSCRIBE]=[],this._middleware[this.MIDDLEWARE_PUBLISH_IN]=[],this._middleware[this.MIDDLEWARE_PUBLISH_OUT]=[],this._middleware[this.MIDDLEWARE_AUTHENTICATE]=[],this.origins=t.origins,this._allowAllOrigins=this.origins.indexOf("*:*")!==-1,this.ackTimeout=t.ackTimeout,this.handshakeTimeout=t.handshakeTimeout,this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.pingTimeoutDisabled=t.pingTimeoutDisabled,this.allowClientPublish=t.allowClientPublish,this.perMessageDeflate=t.perMessageDeflate,this.httpServer=t.httpServer,this.socketChannelLimit=t.socketChannelLimit,this.brokerEngine=t.brokerEngine,this.appName=t.appName||"",this.middlewareEmitWarnings=t.middlewareEmitWarnings,this._path=t.path.replace(/\/?$/,"/").replace(/^\/?/,"/"),this.brokerEngine.isReady?(this.isReady=!0,this.emit("ready",{})):(this.isReady=!1,(async()=>(await this.brokerEngine.listener("ready").once(),this.isReady=!0,this.emit("ready",{})))());let r=typeof t.wsEngine=="string"?de(t.wsEngine):t.wsEngine;if(!r||!r.Server)throw new P("The wsEngine option must be a path or module name which points to a valid WebSocket engine module with a compatible interface");let i=r.Server;if(t.authPrivateKey!=null||t.authPublicKey!=null){if(t.authPrivateKey==null)throw new P("The authPrivateKey option must be specified if authPublicKey is specified");if(t.authPublicKey==null)throw new P("The authPublicKey option must be specified if authPrivateKey is specified");this.signatureKey=t.authPrivateKey,this.verificationKey=t.authPublicKey}else t.authKey==null&&(t.authKey=ve(32)),this.signatureKey=t.authKey,this.verificationKey=t.authKey;this.authVerifyAsync=t.authVerifyAsync,this.authSignAsync=t.authSignAsync,this.defaultVerificationOptions={async:this.authVerifyAsync},t.authVerifyAlgorithms!=null?this.defaultVerificationOptions.algorithms=t.authVerifyAlgorithms:t.authAlgorithm!=null&&(this.defaultVerificationOptions.algorithms=[t.authAlgorithm]),this.defaultSignatureOptions={expiresIn:t.authDefaultExpiry,async:this.authSignAsync},t.authAlgorithm!=null&&(this.defaultSignatureOptions.algorithm=t.authAlgorithm),t.authEngine?this.auth=t.authEngine:this.auth=new oe,t.codecEngine?this.codec=t.codecEngine:this.codec=fe,this.clients={},this.clientsCount=0,this.pendingClients={},this.pendingClientsCount=0,this.exchange=this.brokerEngine.exchange();let s=t.wsEngineServerOptions||{};s.server=this.httpServer,s.verifyClient=this.verifyHandshake.bind(this),s.path==null&&this._path!=null&&(s.path=this._path),s.perMessageDeflate==null&&this.perMessageDeflate!=null&&(s.perMessageDeflate=this.perMessageDeflate),s.handleProtocols==null&&t.handleProtocols!=null&&(s.handleProtocols=t.handleProtocols),s.maxPayload==null&&t.maxPayload!=null&&(s.maxPayload=t.maxPayload),s.clientTracking==null&&(s.clientTracking=!1),A()&&(this.wsServer=new i(s),this.wsServer.on("error",this._handleServerError.bind(this)),this.wsServer.on("connection",this.handleSocketConnection.bind(this)))}handleSocketConnection(e,t){!e.upgradeReq&&t&&(e.upgradeReq=t);let r=this.generateId(),i=new v(r,this,e);i.exchange=this.exchange,this._handleSocketErrors(i),this.pendingClients[r]=i,this.pendingClientsCount++,(async()=>{for await(let h of i.procedure("#authenticate")){let f=h.data;this._processAuthToken(i,f,(p,u,E)=>{if(p?u&&i.deauthenticate():i.triggerAuthenticationEvents(E),p&&u)h.error(p);else{let X={isAuthenticated:!!i.authToken,authError:Z(p)};h.end(X)}})}})(),(async()=>{for await(let h of i.receiver("#removeAuthToken"))i.deauthenticateSelf()})(),(async()=>{for await(let h of i.procedure("#subscribe")){let f=h.data;f?typeof f=="string"&&(f={channel:f}):f={},(async()=>{if(i.state===i.OPEN){try{await this._subscribeSocket(i,f)}catch(u){let E=new R(`Failed to subscribe socket to the ${f.channel} channel - ${u}`);h.error(E),i.emitError(E);return}if(f.batch){h.end(void 0,{batch:!0});return}h.end();return}let p=new d("Cannot subscribe socket to a channel before it has completed the handshake");h.error(p),this.emitWarning(p)})()}})(),(async()=>{for await(let h of i.procedure("#unsubscribe")){let f=h.data,p;try{this._unsubscribeSocket(i,f)}catch(u){p=new R(`Failed to unsubscribe socket from the ${f} channel - ${u}`)}p?(h.error(p),i.emitError(p)):h.end()}})();let m=(h,f,p)=>{clearTimeout(i._handshakeTimeoutRef),i.closeProcedure("#handshake"),i.closeProcedure("#authenticate"),i.closeProcedure("#subscribe"),i.closeProcedure("#unsubscribe"),i.closeReceiver("#removeAuthToken"),i.closeListener("authenticate"),i.closeListener("authStateChange"),i.closeListener("deauthenticate"),!!this.clients[r]&&(delete this.clients[r],this.clientsCount--),!!this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),h==="disconnect"?this.emit("disconnection",{socket:i,code:f,reason:p}):h==="abort"&&this.emit("connectionAbort",{socket:i,code:f,reason:p}),this.emit("closure",{socket:i,code:f,reason:p}),this._unsubscribeSocketFromAllChannels(i)};(async()=>{let h=await i.listener("disconnect").once();m("disconnect",h.code,h.data)})(),(async()=>{let h=await i.listener("connectAbort").once();m("abort",h.code,h.data)})(),i._handshakeTimeoutRef=setTimeout(this._handleHandshakeTimeout.bind(this,i),this.handshakeTimeout),(async()=>{for await(let h of i.procedure("#handshake")){let p=(h.data||{}).authToken||null;clearTimeout(i._handshakeTimeoutRef),this._passThroughHandshakeAGMiddleware({socket:i},(u,E)=>{if(u){u.statusCode==null&&(u.statusCode=E),h.error(u),i.disconnect(u.statusCode);return}this._processAuthToken(i,p,(X,Ue,$e)=>{if(i.state===i.CLOSED)return;let Y={id:i.id,pingTimeout:this.pingTimeout},ie={id:i.id,pingTimeout:this.pingTimeout};X&&p!=null&&(Y.authError=Z(X),ie.authError=X,Ue&&i.deauthenticate()),Y.isAuthenticated=!!i.authToken,ie.isAuthenticated=Y.isAuthenticated,this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),this.clients[r]=i,this.clientsCount++,i.state=i.OPEN,Y.isAuthenticated&&(async()=>(await this.listener("connection").once(),i.triggerAuthenticationEvents($e)))(),i.emit("connect",ie),this.emit("connection",{socket:i,...ie}),h.end(Y)})})}})(),this.emit("handshake",{socket:i})}setAuthEngine(e){this.auth=e}setCodecEngine(e){this.codec=e}emitError(e){this.emit("error",{error:e})}emitWarning(e){this.emit("warning",{warning:e})}close(e){return this.isReady=!1,new Promise((t,r)=>{if(A()){if(this.wsServer.close(i=>{if(i){r(i);return}t()}),!e)for(let i of Object.values(this.clients))i.terminate()}else for(let i of Object.values(this.clients))i.disconnect(1011,"WebSocket broken.")})}getPath(){return this._path}generateId(){return ge()}addMiddleware(e,t){if(!this._middleware[e])throw new T(`Middleware type "${e}" is not supported`);this._middleware[e].push(t)}removeMiddleware(e,t){let r=this._middleware[e];this._middleware[e]=r.filter(i=>i!==t)}async verifyHandshake(e,t){let r=e.req,i=e.origin;(i==="null"||i==null)&&(i="*");let s=!1;if(this._allowAllOrigins)s=!0;else try{let a=new URL(i),o=a.port||(a.protocol==="https:"?443:80);s=~this.origins.indexOf(a.hostname+":"+o)||~this.origins.indexOf(a.hostname+":*")||~this.origins.indexOf("*:"+o)}catch{}if(s){let a=this._middleware[this.MIDDLEWARE_HANDSHAKE_WS];if(a.length){let o=!1;await C(a,r,c=>{o?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_HANDSHAKE_WS} middleware was already invoked`)):(o=!0,c?(c===!0||c.silent?c=new S(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_WS} middleware`,this.MIDDLEWARE_HANDSHAKE_WS):this.middlewareEmitWarnings&&this.emitWarning(c),t(!1,401,typeof c=="string"?c:c.message)):t(!0))})}else t(!0)}else{let a=new B(`Failed to authorize socket handshake - Invalid origin: ${i}`);this.emitWarning(a),t(!1,403,a.message)}}verifyInboundRemoteEvent(e,t){let r=e.socket,i=r.getAuthToken();this.isAuthTokenExpired(i)&&(e.authTokenExpiredError=new N("The socket auth token has expired",i.exp),r.deauthenticate()),this._passThroughMiddleware(e,t)}isAuthTokenExpired(e){if(e&&e.exp!=null){let t=Date.now(),r=e.exp*1e3;return t>r}return!1}async verifyOutboundEvent(e,t,r,i,s){let a=!1;if(t==="#publish"){let o={socket:e,channel:r.channel,data:r.data};await C(this._middleware[this.MIDDLEWARE_PUBLISH_OUT],o,c=>{a?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_PUBLISH_OUT} middleware was already invoked`)):(a=!0,o.data!==void 0&&(r.data=o.data),c?(c===!0||c.silent?c=new S(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_OUT} middleware`,this.MIDDLEWARE_PUBLISH_OUT):this.middlewareEmitWarnings&&this.emitWarning(c),s(c,r)):(i&&o.useCache&&(i.useCache=!0),s(null,r)))})}else s(null,r)}async _processSubscribeAction(e,t,r){let i=!1,s=e.data||{};t.channel=s.channel,t.waitForAuth=s.waitForAuth,t.data=s.data,t.waitForAuth&&t.authTokenExpiredError?r(t.authTokenExpiredError,s):await C(this._middleware[this.MIDDLEWARE_SUBSCRIBE],t,a=>{i?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_SUBSCRIBE} middleware was already invoked`)):(i=!0,a&&(a===!0||a.silent?a=new S(`Action was silently blocked by ${this.MIDDLEWARE_SUBSCRIBE} middleware`,this.MIDDLEWARE_SUBSCRIBE):this.middlewareEmitWarnings&&this.emitWarning(a)),t.data!==void 0&&(s.data=t.data),r(a,s))})}async _processTransmitAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await C(this._middleware[this.MIDDLEWARE_TRANSMIT],t,s=>{i?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_TRANSMIT} middleware was already invoked`)):(i=!0,s&&(s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_TRANSMIT} middleware`,this.MIDDLEWARE_TRANSMIT):this.middlewareEmitWarnings&&this.emitWarning(s)),r(s,t.data))})}async _processPublishAction(e,t,r){let i=!1;if(this.allowClientPublish){let s=e.data||{};t.channel=s.channel,t.data=s.data,await C(this._middleware[this.MIDDLEWARE_PUBLISH_IN],t,a=>{if(i)this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_PUBLISH_IN} middleware was already invoked`));else if(i=!0,t.data!==void 0&&(s.data=t.data),a)a===!0||a.silent?a=new S(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_IN} middleware`,this.MIDDLEWARE_PUBLISH_IN):this.middlewareEmitWarnings&&this.emitWarning(a),r(a,s,t.ackData);else{if(typeof t.channel!="string"){a=new R(`Socket ${t.socket.id} tried to publish to an invalid ${t.channel} channel`),this.emitWarning(a),r(a,s,t.ackData);return}(async()=>{let o;try{await this.exchange.publish(t.channel,t.data)}catch(c){o=c,this.emitWarning(o)}r(o,s,t.ackData)})()}})}else{let s=new d("Client publish feature is disabled");this.emitWarning(s),r(s)}}async _processInvokeAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await C(this._middleware[this.MIDDLEWARE_INVOKE],t,s=>{i?this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_INVOKE} middleware was already invoked`)):(i=!0,s&&(s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_INVOKE} middleware`,this.MIDDLEWARE_INVOKE):this.middlewareEmitWarnings&&this.emitWarning(s)),r(s,t.data))})}_passThroughMiddleware(e,t){let r={socket:e.socket};e.authTokenExpiredError!=null&&(r.authTokenExpiredError=e.authTokenExpiredError);let i=e.event;if(e.cid==null)if(this._isReservedRemoteEvent(i))if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#removeAuthToken")t(null,e.data);else{let s=new d(`The reserved transmitted event ${i} is not supported`);t(s)}else this._processTransmitAction(e,r,t);else if(this._isReservedRemoteEvent(i))if(i==="#subscribe")this._processSubscribeAction(e,r,t);else if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#handshake"||i==="#authenticate"||i==="#unsubscribe")t(null,e.data);else{let s=new d(`The reserved invoked event ${i} is not supported`);t(s)}else this._processInvokeAction(e,r,t)}_isReservedRemoteEvent(e){return typeof e=="string"&&e.indexOf("#")===0}_handleServerError(e){typeof e=="string"&&(e=new B(e)),this.emitError(e)}_handleHandshakeTimeout(e){e.disconnect(4005)}async _handleSocketErrors(e){for await(let t of e.listener("error"))this.emitWarning(t.error)}async _subscribeSocket(e,t){if(!t)throw new d(`Socket ${e.id} provided a malformated channel payload`);if(this.socketChannelLimit&&e.channelSubscriptionsCount>=this.socketChannelLimit)throw new d(`Socket ${e.id} tried to exceed the channel subscription limit of ${this.socketChannelLimit}`);let r=t.channel;if(typeof r!="string")throw new d(`Socket ${e.id} provided an invalid channel name`);e.channelSubscriptionsCount==null&&(e.channelSubscriptionsCount=0),e.channelSubscriptions[r]==null&&(e.channelSubscriptions[r]=!0,e.channelSubscriptionsCount++);try{await this.brokerEngine.subscribeSocket(e,r)}catch(i){throw delete e.channelSubscriptions[r],e.channelSubscriptionsCount--,i}e.emit("subscribe",{channel:r,subscribeOptions:t}),this.emit("subscription",{socket:e,channel:r,subscribeOptions:t})}_unsubscribeSocketFromAllChannels(e){Object.keys(e.channelSubscriptions).forEach(t=>{this._unsubscribeSocket(e,t)})}_unsubscribeSocket(e,t){if(typeof t!="string")throw new d(`Socket ${e.id} tried to unsubscribe from an invalid channel name`);if(!e.channelSubscriptions[t])throw new d(`Socket ${e.id} tried to unsubscribe from a channel which it is not subscribed to`);delete e.channelSubscriptions[t],e.channelSubscriptionsCount!=null&&e.channelSubscriptionsCount--,this.brokerEngine.unsubscribeSocket(e,t),e.emit("unsubscribe",{channel:t}),this.emit("unsubscription",{socket:e,channel:t})}_processTokenError(e){let t=null,r=!0;return e&&(e.name==="TokenExpiredError"?t=new N(e.message,e.expiredAt):e.name==="JsonWebTokenError"?t=new j(e.message):e.name==="NotBeforeError"?(t=new H(e.message,e.date),r=!1):t=new x(e.message)),{authError:t,isBadToken:r}}_emitBadAuthTokenError(e,t,r){e.emit("badAuthToken",{authError:t,signedAuthToken:r}),this.emit("badSocketAuthToken",{socket:e,authError:t,signedAuthToken:r})}_processAuthToken(e,t,r){let i=Object.assign({socket:e},this.defaultVerificationOptions),s=c=>{let m=c.error,b=c.token,y=e.authState;if(b?(e.signedAuthToken=t,e.authToken=b,e.authState=e.AUTHENTICATED):(e.signedAuthToken=null,e.authToken=null,e.authState=e.UNAUTHENTICATED),e.authToken)this._passThroughAuthenticateMiddleware({socket:e,signedAuthToken:e.signedAuthToken,authToken:e.authToken},(l,h)=>{l&&(e.authToken=null,e.authState=e.UNAUTHENTICATED,h&&this._emitBadAuthTokenError(e,l,t)),r(l,h||!1,y)});else{let l=this._processTokenError(m);m&&t!=null&&(e.emitError(l.authError),l.isBadToken&&this._emitBadAuthTokenError(e,l.authError,t)),r(l.authError,l.isBadToken,y)}},a,o;try{a=this.auth.verifyToken(t,this.verificationKey,i)}catch(c){o=c}a instanceof Promise?(async()=>{let c={};try{c.token=await a}catch(m){c.error=m}s(c)})():s({token:a,error:o})}async _passThroughAuthenticateMiddleware(e,t){let r=!1,i={socket:e.socket,authToken:e.authToken};await C(this._middleware[this.MIDDLEWARE_AUTHENTICATE],i,(s,a)=>{if(r)this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_AUTHENTICATE} middleware was already invoked`));else{r=!0;let o=!1;a.length&&(o=a[a.length-1]||!1),s&&(s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_AUTHENTICATE} middleware`,this.MIDDLEWARE_AUTHENTICATE):this.middlewareEmitWarnings&&this.emitWarning(s)),t(s,o)}})}async _passThroughHandshakeAGMiddleware(e,t){let r=!1,i={socket:e.socket};await C(this._middleware[this.MIDDLEWARE_HANDSHAKE_AG],i,(s,a)=>{if(r)this.emitWarning(new d(`Callback for ${this.MIDDLEWARE_HANDSHAKE_AG} middleware was already invoked`));else{r=!0;let o;a.length?o=a[a.length-1]||4008:o=4008,s&&(s.statusCode!=null&&(o=s.statusCode),s===!0||s.silent?s=new S(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_AG} middleware`,this.MIDDLEWARE_HANDSHAKE_AG):this.middlewareEmitWarnings&&this.emitWarning(s)),t(s,o)}})}};function He(n,e){return e=e||{},e.httpServer=n,new z(e)}function kt(n,e,t){if(typeof e=="function"&&(t=e,e={}),A()){let i=de("http").createServer(),s=He(i,e);return s.httpServer=i,s.httpServer.listen(n,t),s}else return new z(e)}return Ye(wt);})();

@@ -1,1 +0,1 @@

var q=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var ge=Object.prototype.hasOwnProperty;var ke=(a,e,t)=>e in a?q(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var se=(a,e)=>{for(var t in e)q(a,t,{get:e[t],enumerable:!0})},Te=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Se(e))!ge.call(a,i)&&i!==t&&q(a,i,{get:()=>e[i],enumerable:!(r=Ee(e,i))||r.enumerable});return a};var ve=a=>Te(q({},"__esModule",{value:!0}),a);var g=(a,e,t)=>(ke(a,typeof e!="symbol"?e+"":e,t),t);var Ne={};se(Ne,{TGSocket:()=>k,TGSocketServer:()=>$,attach:()=>pe,listen:()=>Me});module.exports=ve(Ne);var C=class{next(e){return this.createAsyncIterator(e).next()}async once(e){let t=await this.next(e);return t.done&&await new Promise(()=>{}),t.value}createAsyncIterator(e){throw new TypeError("Method must be overriden by subclass")}createAsyncIterable(e){return{[Symbol.asyncIterator]:()=>this.createAsyncIterator(e)}}[Symbol.asyncIterator](){return this.createAsyncIterator()}};var X=class extends C{name;_streamDemux;constructor(e,t){super(),this.name=t,this._streamDemux=e}createAsyncIterator(e){return this._streamDemux.createAsyncIterator(this.name,e)}};var Q=class extends C{_nextConsumerId;_consumers;_linkedListTailNode;constructor(){super(),this._nextConsumerId=1,this._consumers={},this._linkedListTailNode={next:null}}write(e){this._write(e,!1)}close(){this._write(void 0,!0)}async _waitForNextDataNode(e){return new Promise((t,r)=>{let i,n=this._nextConsumerId++;if(e!==void 0){let s=new Error("Stream consumer iteration timed out");(async()=>{let o=Ae(e);i=o.timeoutId,await o.promise,s.name="TimeoutError",delete this._consumers[n],r(s)})()}this._consumers[n]={resolve:t,timeoutId:i}})}createAsyncIterator(e){let t=this._linkedListTailNode;return{next:async()=>(t.next||await this._waitForNextDataNode(e),t=t.next,t.data)}}_write(e,t){let r={data:{value:e,done:t},next:null};this._linkedListTailNode.next=r,this._linkedListTailNode=r,Object.values(this._consumers).forEach(i=>{i.timeoutId!==void 0&&clearTimeout(i.timeoutId),i.resolve()}),this._consumers={},this._nextConsumerId=1}};function Ae(a=0){let e,t=new Promise(r=>{e=setTimeout(r,a)});return{timeoutId:e,promise:t}}var w=class{_mainStream;constructor(){this._mainStream=new Q}write(e,t){this._write(e,t,!1)}close(e,t){this._write(e,t,!0)}closeAll(){this._mainStream.close()}createAsyncIterator(e,t){let r=this._mainStream.createAsyncIterator(t);return{next:async()=>{for(;;){let i=await r.next();if(i.done)return i;if(i.value.name===e)return i.value.data}}}}stream(e){return new X(this,e)}_write(e,t,r){this._mainStream.write({name:e,data:{value:t,done:r}})}};var _=class{_listenerDemux;constructor(){this._listenerDemux=new w}emit(e,t){this._listenerDemux.write(e,t)}listener(e){return this._listenerDemux.stream(e)}closeListener(e){this._listenerDemux.close(e)}closeAllListeners(){this._listenerDemux.closeAll()}};function ae(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{let e=Math.random()*16|0;return(a==="x"?e:e&3|8).toString(16)})}function oe(){return Math.abs(Math.random()*Math.random()*Date.now()|0).toString()+Math.abs(Math.random()*Math.random()*Date.now()|0).toString()}function ce(a){let e=[],t=[];return function r(i,n){let s,o,c;if(typeof i=="object"&&i!==null&&!(i instanceof Boolean)&&!(i instanceof Date)&&!(i instanceof Number)&&!(i instanceof RegExp)&&!(i instanceof String)){for(s=0;s<e.length;s+=1)if(e[s]===i)return{$ref:t[s]};if(e.push(i),t.push(n),Object.prototype.toString.apply(i)==="[object Array]")for(c=[],s=0;s<i.length;s+=1)c[s]=r(i[s],n+"["+s+"]");else{c={};for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(c[o]=r(i[o],n+"["+JSON.stringify(o)+"]"))}return c}return i}(a,"$")}function S(){"use strict";return typeof function(){return this}()>"u"}var N=class extends Error{expiry;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,N.prototype),this.name="AuthTokenExpiredError",this.message=e,this.expiry=new Date(t),Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},W=class extends Error{isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,W.prototype),this.name="AuthTokenInvalidError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},B=class extends Error{date;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,B.prototype),this.name="AuthTokenNotBeforeError",this.message=e,this.date=t,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},D=class extends Error{expiredAt;date;isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,D.prototype),this.name="AuthTokenError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},U=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,U.prototype),this.name="AuthError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},E=class extends Error{type;constructor(e,t){super(e),Object.setPrototypeOf(this,E.prototype),this.name="SilentMiddlewareBlockedError",this.message=e,this.type=t,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},u=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,u.prototype),this.name="InvalidActionError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},v=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,v.prototype),this.name="InvalidArgumentsError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},O=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,O.prototype),this.name="InvalidOptionsError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var j=class extends Error{code;constructor(e,t){super(e),Object.setPrototypeOf(this,j.prototype),this.name="SocketProtocolError",this.message=e,this.code=t,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},L=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,L.prototype),this.name="ServerProtocolError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var H=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,H.prototype),this.name="TimeoutError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var P=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,P.prototype),this.name="BrokerError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var he={1001:"Socket was disconnected",1002:"A WebSocket protocol error was encountered",1003:"Server terminated socket because it received invalid data",1005:"Socket closed without status code",1006:"Socket hung up",1007:"Message format was incorrect",1008:"Encountered a policy violation",1009:"Message was too big to process",1010:"Client ended the connection because the server did not comply with extension requirements",1011:"Server encountered an unexpected fatal condition",4e3:"Server ping timed out",4001:"Client pong timed out",4002:"Server failed to sign auth token",4003:"Failed to complete handshake",4004:"Client failed to save auth token",4005:"Did not receive #handshake from client before timeout",4006:"Failed to bind socket to message broker",4007:"Client connection establishment timed out",4008:"Server rejected handshake from client",4009:"Server received a message before the client handshake"},le={1e3:"Socket closed normally",1001:"Socket hung up"},we={domain:1,domainEmitter:1,domainThrown:1};function G(a,e){let t;if(a&&typeof a=="object"){t={message:a.message},e&&(t.stack=a.stack);for(let r in a)we[r]||(t[r]=a[r])}else typeof a=="function"?t="[function "+(a.name||"anonymous")+"]":t=a;return ce(t)}function ue(a){let e=null;if(a!=null)if(typeof a=="object"){e=new Error(a.message);for(let t in a)a.hasOwnProperty(t)&&(e[t]=a[t])}else e=a;return e}var _e=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];function De(a){let e=0,t="",r=new Uint8Array(a);for(;e<r.length;e++)t+=_e[r[e]];return t}function de(a=9){let e=new Uint8Array(a);try{return De(e)}catch{return null}}var Z=require("topgun-jsonwebtoken"),Y=class{verifyToken(e,t,r){r=r||{};let i=Object.assign({},r);return delete i.socket,typeof e=="string"||e==null?new Promise((n,s)=>{(0,Z.verify)(e,t,i).then(o=>{o?n(o):s(new D("Invalid token"))}).catch(o=>s(o))}):Promise.reject(new v("Invalid token format - Token must be a string"))}signToken(e,t,r){r=r||{};let i=Object.assign({},r);return new Promise((n,s)=>{(0,Z.sign)(e,t,i).then(o=>{o?n(o):s(new D("Sign token error"))}).catch(o=>s(o))})}};var ne={};se(ne,{decode:()=>Oe,encode:()=>Pe});var R=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global||void 0;function A(){return typeof process=="object"}var ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",xe=/^[ \n\r\t]*[{\[]/,Ie=a=>{let e=new Uint8Array(a),t=e.length,r="";for(let i=0;i<t;i+=3)r+=ee[e[i]>>2],r+=ee[(e[i]&3)<<4|e[i+1]>>4],r+=ee[(e[i+1]&15)<<2|e[i+2]>>6],r+=ee[e[i+2]&63];return t%3===2?r=r.substring(0,r.length-1)+"=":t%3===1&&(r=r.substring(0,r.length-2)+"=="),r},Ce=(a,e)=>{if(R.ArrayBuffer&&e instanceof R.ArrayBuffer)return{base64:!0,data:Ie(e)};if(R.Buffer){if(e instanceof R.Buffer)return{base64:!0,data:e.toString("base64")};if(e&&e.type==="Buffer"&&Array.isArray(e.data)){let t;return R.Buffer.from?t=R.Buffer.from(e.data):t=new R.Buffer(e.data),{base64:!0,data:t.toString("base64")}}}return e};function Oe(a){if(a===null)return null;if(a==="#1"||a==="#2")return a;let e=a.toString();if(!xe.test(e))return e;try{return JSON.parse(e)}catch{}return e}function Pe(a){return a==="#1"||a==="#2"?a:A()?JSON.stringify(a,Ce):JSON.stringify(a)}var te=class{socket;id;sent;constructor(e,t){this.socket=e,this.id=t,this.sent=!1}end(e,t){if(this.id){let r={rid:this.id};e!==void 0&&(r.data=e),this._respond(r,t)}}error(e,t,r){if(this.id){let i=G(e),n={rid:this.id,error:i};t!==void 0&&(n.data=t),this._respond(n,r)}}callback(e,t,r){e?this.error(e,t,r):this.end(t,r)}_respond(e,t){if(this.sent)throw new u(`Response ${this.id} has already been sent`);this.sent=!0,this.socket.sendObject(e,t)}};function me(a){return Object.prototype.toString.call(a)==="[object Date]"}function fe(a){return!!a&&typeof a=="object"&&Object.prototype.toString.call(a)!=="[object Array]"}function V(a){if(me(a))return new Date(a.getTime());if(Array.isArray(a))return[...a].map(e=>V(e));if(a instanceof Map||a instanceof Set)return a;if(fe(a)){let e={};for(let t of Object.keys(a))e[t]=V(a[t]);return e}return a}var x=class extends _{id;server;socket;state;authState;request;remoteAddress;remoteFamily;remotePort;forwardedForAddress;channelSubscriptions;channelSubscriptionsCount;authToken;signedAuthToken;exchange;_handshakeTimeoutRef;CONNECTING=x.CONNECTING;OPEN=x.OPEN;CLOSED=x.CLOSED;AUTHENTICATED=x.AUTHENTICATED;UNAUTHENTICATED=x.UNAUTHENTICATED;_autoAckRPCs;_callbackMap;_pingIntervalTicker;_receiverDemux;_procedureDemux;_cid;_batchSendList;_pingTimeoutTicker;_batchTimeout;constructor(e,t,r){super(),this._autoAckRPCs={"#publish":1},this.id=e,this.server=t,this.socket=r,this.state=this.CONNECTING,this.authState=this.UNAUTHENTICATED,this._receiverDemux=new w,this._procedureDemux=new w,this.request=this.socket.upgradeReq||{},this.request.connection?(this.remoteAddress=this.request.connection.remoteAddress,this.remoteFamily=this.request.connection.remoteFamily,this.remotePort=this.request.connection.remotePort):(this.remoteAddress=this.request.remoteAddress,this.remoteFamily=this.request.remoteFamily,this.remotePort=this.request.remotePort),this.request.forwardedForAddress&&(this.forwardedForAddress=this.request.forwardedForAddress),this._cid=1,this._callbackMap={},this._batchSendList=[],this.channelSubscriptions={},this.channelSubscriptionsCount=0,this._on("error",async i=>{this.emitError(i)}),this._on("close",async(i,n)=>{let s=n&&n.toString();this._onClose(i,s)}),this.server.pingTimeoutDisabled||(this._pingIntervalTicker=setInterval(this._sendPing.bind(this),this.server.pingInterval)),this._resetPongTimeout(),this._on("message",async i=>{let n=A()?i:i.data;this._resetPongTimeout(),this.emit("message",{message:n});let s;try{s=this.decode(n)}catch(o){o.name==="Error"&&(o.name="InvalidMessageError"),this.emitError(o);return}if(s==="#2"){let o=this.getAuthToken();this.server.isAuthTokenExpired(o)&&this.deauthenticate()}else if(Array.isArray(s)){let o=s.length;for(let c=0;c<o;c++)this._handleRemoteEventObject(s[c],n)}else this._handleRemoteEventObject(s,n)})}receiver(e){return this._receiverDemux.stream(e)}closeReceiver(e){this._receiverDemux.close(e)}procedure(e){return this._procedureDemux.stream(e)}closeProcedure(e){this._procedureDemux.close(e)}getState(){return this.state}getBytesReceived(){return this.socket?.bytesReceived}emitError(e){this.emit("error",{error:e})}disconnect(e,t){if(e=e||1e3,typeof e!="number"){let r=new v("If specified, the code argument must be a number");this.emitError(r)}this.state!==this.CLOSED&&(this._onClose(e,t),this.socket.close(e,t))}terminate(){this.socket.terminate()}send(e,t){A()?this.socket.send(e,t,r=>{r&&this._onClose(1006,r.toString())}):this.socket.send(e)}decode(e){return this.server.codec.decode(e)}encode(e){return this.server.codec.encode(e)}sendObjectBatch(e){this._batchSendList.push(e),!this._batchTimeout&&(this._batchTimeout=setTimeout(()=>{if(delete this._batchTimeout,this._batchSendList.length){let t;try{t=this.encode(this._batchSendList)}catch(r){this.emitError(r)}t!=null&&this.send(t),this._batchSendList=[]}},this.server.options.pubSubBatchDuration||0))}sendObjectSingle(e){let t;try{t=this.encode(e)}catch(r){this.emitError(r)}t!=null&&this.send(t)}sendObject(e,t){t&&t.batch?this.sendObjectBatch(e):this.sendObjectSingle(e)}transmit(e,t,r){return this.server.verifyOutboundEvent(this,e,t,r,(i,n)=>{let s={event:e};n!==void 0&&(s.data=n),i||(r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(s))}),Promise.resolve()}invoke(e,t,r){return new Promise((i,n)=>{this.server.verifyOutboundEvent(this,e,t,r,(s,o)=>{if(s){n(s);return}let c={event:e,cid:this._nextCallId()};o!==void 0&&(c.data=o);let f=setTimeout(()=>{let b=new H(`Event response for "${e}" timed out`);delete this._callbackMap[c.cid],n(b)},this.server.ackTimeout);this._callbackMap[c.cid]={callback:(b,T)=>{if(b){n(b);return}i(T)},timeout:f},r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(c)})})}triggerAuthenticationEvents(e){if(e!==this.AUTHENTICATED){let t={oldAuthState:e,newAuthState:this.authState,authToken:this.authToken};this.emit("authStateChange",t),this.server.emit("authenticationStateChange",{socket:this,...t})}this.emit("authenticate",{authToken:this.authToken}),this.server.emit("authentication",{socket:this,authToken:this.authToken})}async setAuthToken(e,t){let r=V(e),i=this.authState;if(this.authState=this.AUTHENTICATED,t==null)t={};else if(t=V(t),t.algorithm!=null){delete t.algorithm;let l=new v("Cannot change auth token algorithm at runtime - It must be specified as a config option on launch");this.emitError(l)}t.mutatePayload=!0;let n=t.rejectOnFailedDelivery;delete t.rejectOnFailedDelivery;let s=this.server.defaultSignatureOptions,o;t.expiresIn==null?o=s.expiresIn:o=t.expiresIn,r?r.exp==null?t.expiresIn=o:delete t.expiresIn:t.expiresIn=o,s.algorithm!=null&&(t.algorithm=s.algorithm),this.authToken=r;let c=l=>{throw this.emitError(l),this._onClose(4002,l.toString()),this.socket.close(4002),l},f=async l=>{let h={token:l};try{return await this.invoke("#setAuthToken",h)}catch(d){throw new U(`Failed to deliver auth token to client - ${d}`)}},b;try{b=this.server.auth.signToken(r,this.server.signatureKey,t)}catch(l){c(l)}let T;if(b instanceof Promise)try{T=await b}catch(l){c(l)}else T=b;this.authToken===r&&(this.signedAuthToken=T,this.emit("authTokenSigned",{signedAuthToken:T})),this.triggerAuthenticationEvents(i);try{await f(T)}catch(l){if(this.emitError(l),n)throw l}}getAuthToken(){return this.authToken}deauthenticateSelf(){let e=this.authState,t=this.authToken;if(this.signedAuthToken=null,this.authToken=null,this.authState=this.UNAUTHENTICATED,e!==this.UNAUTHENTICATED){let r={oldAuthState:e,newAuthState:this.authState};this.emit("authStateChange",r),this.server.emit("authenticationStateChange",{socket:this,...r})}this.emit("deauthenticate",{oldAuthToken:t}),this.server.emit("deauthentication",{socket:this,oldAuthToken:t})}deauthenticate(){return this.deauthenticateSelf(),this.invoke("#removeAuthToken")}kickOut(e,t){return e==null?Object.keys(this.channelSubscriptions).forEach(r=>{delete this.channelSubscriptions[r],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:r})}):(delete this.channelSubscriptions[e],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:e})),this.server.brokerEngine.unsubscribeSocket(this,e)}subscriptions(){return Object.keys(this.channelSubscriptions)}isSubscribed(e){return!!this.channelSubscriptions[e]}_onClose(e,t){if(clearInterval(this._pingIntervalTicker),clearTimeout(this._pingTimeoutTicker),this.state!==this.CLOSED){let r=this.state;if(this.state=this.CLOSED,r===this.CONNECTING?this.emit("connectAbort",{code:e,reason:t}):this.emit("disconnect",{code:e,reason:t}),this.emit("close",{code:e,reason:t}),!x.ignoreStatuses[e]){let i;if(t){let s;if(typeof t=="object")try{s=JSON.stringify(t)}catch{s=t.toString()}else s=t;i=`Socket connection closed with status code ${e} and reason: ${s}`}else i=`Socket connection closed with status code ${e}`;let n=new j(x.errorStatuses[e]||i,e);this.emitError(n)}}}_sendPing(){this.state!==this.CLOSED&&this.sendObject("#1")}_handleRemoteEventObject(e,t){if(e&&e.event!=null){let r=e.event,i={socket:this,event:r,data:e.data};if(e.cid==null)this.server.verifyInboundRemoteEvent(i,(n,s)=>{n||this._receiverDemux.write(r,s)});else{i.cid=e.cid;let n=new te(this,i.cid);this.server.verifyInboundRemoteEvent(i,(s,o,c)=>{s?n.error(s):this._autoAckRPCs[r]?c!==void 0?n.end(c):n.end():this._procedureDemux.write(r,{data:o,end:f=>{n.end(f)},error:f=>{n.error(f)}})})}}else if(e&&e.rid!=null){let r=this._callbackMap[e.rid];if(r){clearTimeout(r.timeout),delete this._callbackMap[e.rid];let i=ue(e.error);r.callback(i,e.data)}}else this.emit("raw",{message:t})}_resetPongTimeout(){this.server.pingTimeoutDisabled||(clearTimeout(this._pingTimeoutTicker),this._pingTimeoutTicker=setTimeout(()=>{this._onClose(4001),this.socket.close(4001)},this.server.pingTimeout))}_nextCallId(){return this._cid++}_on(e,t){A()?this.socket.on(e,t):this.socket.addEventListener(e,t)}},k=x;g(k,"CONNECTING","connecting"),g(k,"OPEN","open"),g(k,"CLOSED","closed"),g(k,"AUTHENTICATED","authenticated"),g(k,"UNAUTHENTICATED","unauthenticated"),g(k,"ignoreStatuses",le),g(k,"errorStatuses",he);async function Re(a,e){for(let t=0;t<a.length;t++)await e(a[t],t,a)}async function I(a,...e){let t=typeof e[e.length-1]=="function"?e.pop():()=>{},r=null,i=[];return await Re(a,async n=>{if(!r)try{let s=await n(...e);i.push(s)}catch(s){i.push(void 0),r=s}}),t(r,i),i}var J=class extends C{PENDING;SUBSCRIBED;UNSUBSCRIBED;name;client;_pendingSubscriptionCid;_eventDemux;_dataStream;constructor(e,t,r,i){super(),this.PENDING=J.PENDING,this.SUBSCRIBED=J.SUBSCRIBED,this.UNSUBSCRIBED=J.UNSUBSCRIBED,this.name=e,this.client=t,this._eventDemux=r,this._dataStream=i}get state(){return this.client.getChannelState(this.name)}set state(e){throw new Error("Cannot directly set channel state")}get options(){return this.client.getChannelOptions(this.name)}set options(e){throw new Error("Cannot directly set channel options")}createAsyncIterator(e){return this._dataStream.createAsyncIterator(e)}listener(e){return this._eventDemux.stream(`${this.name}/${e}`)}closeListener(e){this._eventDemux.close(`${this.name}/${e}`)}closeAllListeners(){this._eventDemux.closeAll()}close(){this.client.closeChannel(this.name)}subscribe(e){this.client.subscribe(this.name,e)}unsubscribe(){this.client.unsubscribe(this.name)}isSubscribed(e){return this.client.isSubscribed(this.name,e)}publish(e){return this.client.publish(this.name,e)}},p=J;g(p,"PENDING","pending"),g(p,"SUBSCRIBED","subscribed"),g(p,"UNSUBSCRIBED","unsubscribed");var ie=class extends _{_broker;_channelMap;_channelEventDemux;_channelDataDemux;constructor(e){super(),this._broker=e,this._channelMap={},this._channelEventDemux=new w,this._channelDataDemux=new w,(async()=>{for await(let{channel:t,data:r}of this._broker.listener("publish"))this._channelDataDemux.write(t,r)})()}destroy(){this._broker.closeAllListeners()}publish(e,t){return this._broker.publish(e,t)}subscribe(e){let t=this._channelMap[e];t||(t={name:e,state:p.PENDING},this._channelMap[e]=t,this._triggerChannelSubscribe(t));let r=this._channelDataDemux.stream(e);return new p(e,this,this._channelEventDemux,r)}unsubscribe(e){let t=this._channelMap[e];t&&this._triggerChannelUnsubscribe(t)}channel(e){let t=this._channelDataDemux.stream(e);return new p(e,this,this._channelEventDemux,t)}getChannelState(e){let t=this._channelMap[e];return t?t.state:p.UNSUBSCRIBED}getChannelOptions(e){return{}}subscriptions(e){let t=[];return Object.keys(this._channelMap).forEach(r=>{(e||this._channelMap[r].state===p.SUBSCRIBED)&&t.push(r)}),t}isSubscribed(e,t){let r=this._channelMap[e];return t?!!r:!!r&&r.state===p.SUBSCRIBED}_triggerChannelSubscribe(e){let t=e.name;e.state=p.SUBSCRIBED,this._channelEventDemux.write(`${t}/subscribe`,{}),this.emit("subscribe",{channel:t})}_triggerChannelUnsubscribe(e){let t=e.name;delete this._channelMap[t],e.state===p.SUBSCRIBED&&(this._channelEventDemux.write(`${t}/unsubscribe`,{}),this.emit("unsubscribe",{channel:t}))}};var re=class extends _{isReady;_exchangeClient;_clientSubscribers;_clientSubscribersCounter;constructor(){super(),this.isReady=!1,this._exchangeClient=new ie(this),this._clientSubscribers={},this._clientSubscribersCounter={},setTimeout(()=>{this.isReady=!0,this.emit("ready",{})},0)}exchange(){return this._exchangeClient}subscribeSocket(e,t){return this._clientSubscribers[t]||(this._clientSubscribers[t]={},this._clientSubscribersCounter[t]=0),this._clientSubscribers[t][e.id]||(this._clientSubscribersCounter[t]++,this.emit("subscribe",{channel:t})),this._clientSubscribers[t][e.id]=e,Promise.resolve()}unsubscribeSocket(e,t){return this._clientSubscribers[t]&&this._clientSubscribers[t][e.id]&&(this._clientSubscribersCounter[t]--,delete this._clientSubscribers[t][e.id],this._clientSubscribersCounter[t]<=0&&(delete this._clientSubscribers[t],delete this._clientSubscribersCounter[t],this.emit("unsubscribe",{channel:t}))),Promise.resolve()}subscriptions(){return Object.keys(this._clientSubscribers)}isSubscribed(e){return!!this._clientSubscribers[e]}publish(e,t,r){let i={channel:e,data:t},n=this._clientSubscribers[e]||{};return Object.keys(n).forEach(s=>{n[s].transmit("#publish",i)}),r||this.emit("publish",i),Promise.resolve()}};var $=class extends _{options;MIDDLEWARE_HANDSHAKE_WS;MIDDLEWARE_HANDSHAKE_AG;MIDDLEWARE_TRANSMIT;MIDDLEWARE_INVOKE;MIDDLEWARE_SUBSCRIBE;MIDDLEWARE_PUBLISH_IN;MIDDLEWARE_PUBLISH_OUT;MIDDLEWARE_AUTHENTICATE;origins;ackTimeout;handshakeTimeout;pingInterval;pingTimeout;pingTimeoutDisabled;allowClientPublish;perMessageDeflate;httpServer;socketChannelLimit;brokerEngine;appName;middlewareEmitWarnings;isReady;signatureKey;verificationKey;authVerifyAsync;authSignAsync;defaultVerificationOptions;defaultSignatureOptions;auth;codec;clients;clientsCount;pendingClients;pendingClientsCount;exchange;_middleware;_allowAllOrigins;wsServer;_path;constructor(e){super();let t={brokerEngine:new re,wsEngine:"ws",wsEngineServerOptions:{},maxPayload:null,allowClientPublish:!0,ackTimeout:1e4,handshakeTimeout:1e4,pingTimeout:2e4,pingTimeoutDisabled:!1,pingInterval:8e3,origins:"*:*",appName:ae(),path:"/topgunsocket/",authDefaultExpiry:86400,authSignAsync:!1,authVerifyAsync:!0,pubSubBatchDuration:null,middlewareEmitWarnings:!0};this.options=Object.assign(t,e||{}),this.MIDDLEWARE_HANDSHAKE_WS="handshakeWS",this.MIDDLEWARE_HANDSHAKE_AG="handshakeAG",this.MIDDLEWARE_TRANSMIT="transmit",this.MIDDLEWARE_INVOKE="invoke",this.MIDDLEWARE_SUBSCRIBE="subscribe",this.MIDDLEWARE_PUBLISH_IN="publishIn",this.MIDDLEWARE_PUBLISH_OUT="publishOut",this.MIDDLEWARE_AUTHENTICATE="authenticate",this._middleware={},this._middleware[this.MIDDLEWARE_HANDSHAKE_WS]=[],this._middleware[this.MIDDLEWARE_HANDSHAKE_AG]=[],this._middleware[this.MIDDLEWARE_TRANSMIT]=[],this._middleware[this.MIDDLEWARE_INVOKE]=[],this._middleware[this.MIDDLEWARE_SUBSCRIBE]=[],this._middleware[this.MIDDLEWARE_PUBLISH_IN]=[],this._middleware[this.MIDDLEWARE_PUBLISH_OUT]=[],this._middleware[this.MIDDLEWARE_AUTHENTICATE]=[],this.origins=t.origins,this._allowAllOrigins=this.origins.indexOf("*:*")!==-1,this.ackTimeout=t.ackTimeout,this.handshakeTimeout=t.handshakeTimeout,this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.pingTimeoutDisabled=t.pingTimeoutDisabled,this.allowClientPublish=t.allowClientPublish,this.perMessageDeflate=t.perMessageDeflate,this.httpServer=t.httpServer,this.socketChannelLimit=t.socketChannelLimit,this.brokerEngine=t.brokerEngine,this.appName=t.appName||"",this.middlewareEmitWarnings=t.middlewareEmitWarnings,this._path=t.path.replace(/\/?$/,"/").replace(/^\/?/,"/"),this.brokerEngine.isReady?(this.isReady=!0,this.emit("ready",{})):(this.isReady=!1,(async()=>(await this.brokerEngine.listener("ready").once(),this.isReady=!0,this.emit("ready",{})))());let r=typeof t.wsEngine=="string"?require(t.wsEngine):t.wsEngine;if(!r||!r.Server)throw new O("The wsEngine option must be a path or module name which points to a valid WebSocket engine module with a compatible interface");let i=r.Server;if(t.authPrivateKey!=null||t.authPublicKey!=null){if(t.authPrivateKey==null)throw new O("The authPrivateKey option must be specified if authPublicKey is specified");if(t.authPublicKey==null)throw new O("The authPublicKey option must be specified if authPrivateKey is specified");this.signatureKey=t.authPrivateKey,this.verificationKey=t.authPublicKey}else t.authKey==null&&(t.authKey=de(32)),this.signatureKey=t.authKey,this.verificationKey=t.authKey;this.authVerifyAsync=t.authVerifyAsync,this.authSignAsync=t.authSignAsync,this.defaultVerificationOptions={async:this.authVerifyAsync},t.authVerifyAlgorithms!=null?this.defaultVerificationOptions.algorithms=t.authVerifyAlgorithms:t.authAlgorithm!=null&&(this.defaultVerificationOptions.algorithms=[t.authAlgorithm]),this.defaultSignatureOptions={expiresIn:t.authDefaultExpiry,async:this.authSignAsync},t.authAlgorithm!=null&&(this.defaultSignatureOptions.algorithm=t.authAlgorithm),t.authEngine?this.auth=t.authEngine:this.auth=new Y,t.codecEngine?this.codec=t.codecEngine:this.codec=ne,this.clients={},this.clientsCount=0,this.pendingClients={},this.pendingClientsCount=0,this.exchange=this.brokerEngine.exchange();let n=t.wsEngineServerOptions||{};n.server=this.httpServer,n.verifyClient=this.verifyHandshake.bind(this),n.path==null&&this._path!=null&&(n.path=this._path),n.perMessageDeflate==null&&this.perMessageDeflate!=null&&(n.perMessageDeflate=this.perMessageDeflate),n.handleProtocols==null&&t.handleProtocols!=null&&(n.handleProtocols=t.handleProtocols),n.maxPayload==null&&t.maxPayload!=null&&(n.maxPayload=t.maxPayload),n.clientTracking==null&&(n.clientTracking=!1),A()?(this.wsServer=new i(n),this.wsServer.on("error",this._handleServerError.bind(this)),this.wsServer.on("connection",this._handleSocketConnection.bind(this))):(this.wsServer=i,this.wsServer.addEventListener("close",this._handleServerError.bind(this)),this.wsServer.addEventListener("error",this._handleServerError.bind(this)),this._handleSocketConnection(i))}setAuthEngine(e){this.auth=e}setCodecEngine(e){this.codec=e}emitError(e){this.emit("error",{error:e})}emitWarning(e){this.emit("warning",{warning:e})}close(e){return this.isReady=!1,new Promise((t,r)=>{if(A()&&this.wsServer.close(i=>{if(i){r(i);return}t()}),!e)for(let i of Object.values(this.clients))i.terminate()})}getPath(){return this._path}generateId(){return oe()}addMiddleware(e,t){if(!this._middleware[e])throw new v(`Middleware type "${e}" is not supported`);this._middleware[e].push(t)}removeMiddleware(e,t){let r=this._middleware[e];this._middleware[e]=r.filter(i=>i!==t)}async verifyHandshake(e,t){let r=e.req,i=e.origin;(i==="null"||i==null)&&(i="*");let n=!1;if(this._allowAllOrigins)n=!0;else try{let s=new URL(i),o=s.port||(s.protocol==="https:"?443:80);n=~this.origins.indexOf(s.hostname+":"+o)||~this.origins.indexOf(s.hostname+":*")||~this.origins.indexOf("*:"+o)}catch{}if(n){let s=this._middleware[this.MIDDLEWARE_HANDSHAKE_WS];if(s.length){let o=!1;await I(s,r,c=>{o?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_HANDSHAKE_WS} middleware was already invoked`)):(o=!0,c?(c===!0||c.silent?c=new E(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_WS} middleware`,this.MIDDLEWARE_HANDSHAKE_WS):this.middlewareEmitWarnings&&this.emitWarning(c),t(!1,401,typeof c=="string"?c:c.message)):t(!0))})}else t(!0)}else{let s=new L(`Failed to authorize socket handshake - Invalid origin: ${i}`);this.emitWarning(s),t(!1,403,s.message)}}verifyInboundRemoteEvent(e,t){let r=e.socket,i=r.getAuthToken();this.isAuthTokenExpired(i)&&(e.authTokenExpiredError=new N("The socket auth token has expired",i.exp),r.deauthenticate()),this._passThroughMiddleware(e,t)}isAuthTokenExpired(e){if(e&&e.exp!=null){let t=Date.now(),r=e.exp*1e3;return t>r}return!1}async verifyOutboundEvent(e,t,r,i,n){let s=!1;if(t==="#publish"){let o={socket:e,channel:r.channel,data:r.data};await I(this._middleware[this.MIDDLEWARE_PUBLISH_OUT],o,c=>{s?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_PUBLISH_OUT} middleware was already invoked`)):(s=!0,o.data!==void 0&&(r.data=o.data),c?(c===!0||c.silent?c=new E(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_OUT} middleware`,this.MIDDLEWARE_PUBLISH_OUT):this.middlewareEmitWarnings&&this.emitWarning(c),n(c,r)):(i&&o.useCache&&(i.useCache=!0),n(null,r)))})}else n(null,r)}async _processSubscribeAction(e,t,r){let i=!1,n=e.data||{};t.channel=n.channel,t.waitForAuth=n.waitForAuth,t.data=n.data,t.waitForAuth&&t.authTokenExpiredError?r(t.authTokenExpiredError,n):await I(this._middleware[this.MIDDLEWARE_SUBSCRIBE],t,s=>{i?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_SUBSCRIBE} middleware was already invoked`)):(i=!0,s&&(s===!0||s.silent?s=new E(`Action was silently blocked by ${this.MIDDLEWARE_SUBSCRIBE} middleware`,this.MIDDLEWARE_SUBSCRIBE):this.middlewareEmitWarnings&&this.emitWarning(s)),t.data!==void 0&&(n.data=t.data),r(s,n))})}async _processTransmitAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await I(this._middleware[this.MIDDLEWARE_TRANSMIT],t,n=>{i?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_TRANSMIT} middleware was already invoked`)):(i=!0,n&&(n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_TRANSMIT} middleware`,this.MIDDLEWARE_TRANSMIT):this.middlewareEmitWarnings&&this.emitWarning(n)),r(n,t.data))})}async _processPublishAction(e,t,r){let i=!1;if(this.allowClientPublish){let n=e.data||{};t.channel=n.channel,t.data=n.data,await I(this._middleware[this.MIDDLEWARE_PUBLISH_IN],t,s=>{if(i)this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_PUBLISH_IN} middleware was already invoked`));else if(i=!0,t.data!==void 0&&(n.data=t.data),s)s===!0||s.silent?s=new E(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_IN} middleware`,this.MIDDLEWARE_PUBLISH_IN):this.middlewareEmitWarnings&&this.emitWarning(s),r(s,n,t.ackData);else{if(typeof t.channel!="string"){s=new P(`Socket ${t.socket.id} tried to publish to an invalid ${t.channel} channel`),this.emitWarning(s),r(s,n,t.ackData);return}(async()=>{let o;try{await this.exchange.publish(t.channel,t.data)}catch(c){o=c,this.emitWarning(o)}r(o,n,t.ackData)})()}})}else{let n=new u("Client publish feature is disabled");this.emitWarning(n),r(n)}}async _processInvokeAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await I(this._middleware[this.MIDDLEWARE_INVOKE],t,n=>{i?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_INVOKE} middleware was already invoked`)):(i=!0,n&&(n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_INVOKE} middleware`,this.MIDDLEWARE_INVOKE):this.middlewareEmitWarnings&&this.emitWarning(n)),r(n,t.data))})}_passThroughMiddleware(e,t){let r={socket:e.socket};e.authTokenExpiredError!=null&&(r.authTokenExpiredError=e.authTokenExpiredError);let i=e.event;if(e.cid==null)if(this._isReservedRemoteEvent(i))if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#removeAuthToken")t(null,e.data);else{let n=new u(`The reserved transmitted event ${i} is not supported`);t(n)}else this._processTransmitAction(e,r,t);else if(this._isReservedRemoteEvent(i))if(i==="#subscribe")this._processSubscribeAction(e,r,t);else if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#handshake"||i==="#authenticate"||i==="#unsubscribe")t(null,e.data);else{let n=new u(`The reserved invoked event ${i} is not supported`);t(n)}else this._processInvokeAction(e,r,t)}_isReservedRemoteEvent(e){return typeof e=="string"&&e.indexOf("#")===0}_handleServerError(e){typeof e=="string"&&(e=new L(e)),this.emitError(e)}_handleHandshakeTimeout(e){e.disconnect(4005)}async _handleSocketErrors(e){for await(let t of e.listener("error"))this.emitWarning(t.error)}async _subscribeSocket(e,t){if(!t)throw new u(`Socket ${e.id} provided a malformated channel payload`);if(this.socketChannelLimit&&e.channelSubscriptionsCount>=this.socketChannelLimit)throw new u(`Socket ${e.id} tried to exceed the channel subscription limit of ${this.socketChannelLimit}`);let r=t.channel;if(typeof r!="string")throw new u(`Socket ${e.id} provided an invalid channel name`);e.channelSubscriptionsCount==null&&(e.channelSubscriptionsCount=0),e.channelSubscriptions[r]==null&&(e.channelSubscriptions[r]=!0,e.channelSubscriptionsCount++);try{await this.brokerEngine.subscribeSocket(e,r)}catch(i){throw delete e.channelSubscriptions[r],e.channelSubscriptionsCount--,i}e.emit("subscribe",{channel:r,subscribeOptions:t}),this.emit("subscription",{socket:e,channel:r,subscribeOptions:t})}_unsubscribeSocketFromAllChannels(e){Object.keys(e.channelSubscriptions).forEach(t=>{this._unsubscribeSocket(e,t)})}_unsubscribeSocket(e,t){if(typeof t!="string")throw new u(`Socket ${e.id} tried to unsubscribe from an invalid channel name`);if(!e.channelSubscriptions[t])throw new u(`Socket ${e.id} tried to unsubscribe from a channel which it is not subscribed to`);delete e.channelSubscriptions[t],e.channelSubscriptionsCount!=null&&e.channelSubscriptionsCount--,this.brokerEngine.unsubscribeSocket(e,t),e.emit("unsubscribe",{channel:t}),this.emit("unsubscription",{socket:e,channel:t})}_processTokenError(e){let t=null,r=!0;return e&&(e.name==="TokenExpiredError"?t=new N(e.message,e.expiredAt):e.name==="JsonWebTokenError"?t=new W(e.message):e.name==="NotBeforeError"?(t=new B(e.message,e.date),r=!1):t=new D(e.message)),{authError:t,isBadToken:r}}_emitBadAuthTokenError(e,t,r){e.emit("badAuthToken",{authError:t,signedAuthToken:r}),this.emit("badSocketAuthToken",{socket:e,authError:t,signedAuthToken:r})}_processAuthToken(e,t,r){let i=Object.assign({socket:e},this.defaultVerificationOptions),n=c=>{let f=c.error,b=c.token,T=e.authState;if(b?(e.signedAuthToken=t,e.authToken=b,e.authState=e.AUTHENTICATED):(e.signedAuthToken=null,e.authToken=null,e.authState=e.UNAUTHENTICATED),e.authToken)this._passThroughAuthenticateMiddleware({socket:e,signedAuthToken:e.signedAuthToken,authToken:e.authToken},(l,h)=>{l&&(e.authToken=null,e.authState=e.UNAUTHENTICATED,h&&this._emitBadAuthTokenError(e,l,t)),r(l,h||!1,T)});else{let l=this._processTokenError(f);f&&t!=null&&(e.emitError(l.authError),l.isBadToken&&this._emitBadAuthTokenError(e,l.authError,t)),r(l.authError,l.isBadToken,T)}},s,o;try{s=this.auth.verifyToken(t,this.verificationKey,i)}catch(c){o=c}s instanceof Promise?(async()=>{let c={};try{c.token=await s}catch(f){c.error=f}n(c)})():n({token:s,error:o})}async _passThroughAuthenticateMiddleware(e,t){let r=!1,i={socket:e.socket,authToken:e.authToken};await I(this._middleware[this.MIDDLEWARE_AUTHENTICATE],i,(n,s)=>{if(r)this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_AUTHENTICATE} middleware was already invoked`));else{r=!0;let o=!1;s.length&&(o=s[s.length-1]||!1),n&&(n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_AUTHENTICATE} middleware`,this.MIDDLEWARE_AUTHENTICATE):this.middlewareEmitWarnings&&this.emitWarning(n)),t(n,o)}})}async _passThroughHandshakeAGMiddleware(e,t){let r=!1,i={socket:e.socket};await I(this._middleware[this.MIDDLEWARE_HANDSHAKE_AG],i,(n,s)=>{if(r)this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_HANDSHAKE_AG} middleware was already invoked`));else{r=!0;let o;s.length?o=s[s.length-1]||4008:o=4008,n&&(n.statusCode!=null&&(o=n.statusCode),n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_AG} middleware`,this.MIDDLEWARE_HANDSHAKE_AG):this.middlewareEmitWarnings&&this.emitWarning(n)),t(n,o)}})}_handleSocketConnection(e,t){!e.upgradeReq&&t&&(e.upgradeReq=t);let r=this.generateId(),i=new k(r,this,e);i.exchange=this.exchange,this._handleSocketErrors(i),this.pendingClients[r]=i,this.pendingClientsCount++,(async()=>{for await(let h of i.procedure("#authenticate")){let d=h.data;this._processAuthToken(i,d,(m,y,M)=>{if(m?y&&i.deauthenticate():i.triggerAuthenticationEvents(M),m&&y)h.error(m);else{let K={isAuthenticated:!!i.authToken,authError:G(m)};h.end(K)}})}})(),(async()=>{for await(let h of i.receiver("#removeAuthToken"))i.deauthenticateSelf()})(),(async()=>{for await(let h of i.procedure("#subscribe")){let d=h.data;d?typeof d=="string"&&(d={channel:d}):d={},(async()=>{if(i.state===i.OPEN){try{await this._subscribeSocket(i,d)}catch(y){let M=new P(`Failed to subscribe socket to the ${d.channel} channel - ${y}`);h.error(M),i.emitError(M);return}if(d.batch){h.end(void 0,{batch:!0});return}h.end();return}let m=new u("Cannot subscribe socket to a channel before it has completed the handshake");h.error(m),this.emitWarning(m)})()}})(),(async()=>{for await(let h of i.procedure("#unsubscribe")){let d=h.data,m;try{this._unsubscribeSocket(i,d)}catch(y){m=new P(`Failed to unsubscribe socket from the ${d} channel - ${y}`)}m?(h.error(m),i.emitError(m)):h.end()}})();let f=(h,d,m)=>{clearTimeout(i._handshakeTimeoutRef),i.closeProcedure("#handshake"),i.closeProcedure("#authenticate"),i.closeProcedure("#subscribe"),i.closeProcedure("#unsubscribe"),i.closeReceiver("#removeAuthToken"),i.closeListener("authenticate"),i.closeListener("authStateChange"),i.closeListener("deauthenticate"),!!this.clients[r]&&(delete this.clients[r],this.clientsCount--),!!this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),h==="disconnect"?this.emit("disconnection",{socket:i,code:d,reason:m}):h==="abort"&&this.emit("connectionAbort",{socket:i,code:d,reason:m}),this.emit("closure",{socket:i,code:d,reason:m}),this._unsubscribeSocketFromAllChannels(i)};(async()=>{let h=await i.listener("disconnect").once();f("disconnect",h.code,h.data)})(),(async()=>{let h=await i.listener("connectAbort").once();f("abort",h.code,h.data)})(),i._handshakeTimeoutRef=setTimeout(this._handleHandshakeTimeout.bind(this,i),this.handshakeTimeout),(async()=>{for await(let h of i.procedure("#handshake")){let m=(h.data||{}).authToken||null;clearTimeout(i._handshakeTimeoutRef),this._passThroughHandshakeAGMiddleware({socket:i},(y,M)=>{if(y){y.statusCode==null&&(y.statusCode=M),h.error(y),i.disconnect(y.statusCode);return}this._processAuthToken(i,m,(K,be,ye)=>{if(i.state===i.CLOSED)return;let F={id:i.id,pingTimeout:this.pingTimeout},z={id:i.id,pingTimeout:this.pingTimeout};K&&m!=null&&(F.authError=G(K),z.authError=K,be&&i.deauthenticate()),F.isAuthenticated=!!i.authToken,z.isAuthenticated=F.isAuthenticated,this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),this.clients[r]=i,this.clientsCount++,i.state=i.OPEN,F.isAuthenticated&&(async()=>(await this.listener("connection").once(),i.triggerAuthenticationEvents(ye)))(),i.emit("connect",z),this.emit("connection",{socket:i,...z}),h.end(F)})})}})(),this.emit("handshake",{socket:i})}};function pe(a,e){return e=e||{},e.httpServer=a,new $(e)}function Me(a,e,t){if(typeof e=="function"&&(t=e,e={}),A()){let i=require("http").createServer(),n=pe(i,e);return n.httpServer=i,n.httpServer.listen(a,t),n}else return new $(e)}0&&(module.exports={TGSocket,TGSocketServer,attach,listen});
var q=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var ge=Object.prototype.hasOwnProperty;var ke=(a,e,t)=>e in a?q(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var se=(a,e)=>{for(var t in e)q(a,t,{get:e[t],enumerable:!0})},Te=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Se(e))!ge.call(a,i)&&i!==t&&q(a,i,{get:()=>e[i],enumerable:!(r=Ee(e,i))||r.enumerable});return a};var ve=a=>Te(q({},"__esModule",{value:!0}),a);var g=(a,e,t)=>(ke(a,typeof e!="symbol"?e+"":e,t),t);var Ne={};se(Ne,{TGSocket:()=>k,TGSocketServer:()=>$,attach:()=>pe,listen:()=>Me});module.exports=ve(Ne);var C=class{next(e){return this.createAsyncIterator(e).next()}async once(e){let t=await this.next(e);return t.done&&await new Promise(()=>{}),t.value}createAsyncIterator(e){throw new TypeError("Method must be overriden by subclass")}createAsyncIterable(e){return{[Symbol.asyncIterator]:()=>this.createAsyncIterator(e)}}[Symbol.asyncIterator](){return this.createAsyncIterator()}};var X=class extends C{name;_streamDemux;constructor(e,t){super(),this.name=t,this._streamDemux=e}createAsyncIterator(e){return this._streamDemux.createAsyncIterator(this.name,e)}};var Q=class extends C{_nextConsumerId;_consumers;_linkedListTailNode;constructor(){super(),this._nextConsumerId=1,this._consumers={},this._linkedListTailNode={next:null}}write(e){this._write(e,!1)}close(){this._write(void 0,!0)}async _waitForNextDataNode(e){return new Promise((t,r)=>{let i,n=this._nextConsumerId++;if(e!==void 0){let s=new Error("Stream consumer iteration timed out");(async()=>{let o=Ae(e);i=o.timeoutId,await o.promise,s.name="TimeoutError",delete this._consumers[n],r(s)})()}this._consumers[n]={resolve:t,timeoutId:i}})}createAsyncIterator(e){let t=this._linkedListTailNode;return{next:async()=>(t.next||await this._waitForNextDataNode(e),t=t.next,t.data)}}_write(e,t){let r={data:{value:e,done:t},next:null};this._linkedListTailNode.next=r,this._linkedListTailNode=r,Object.values(this._consumers).forEach(i=>{i.timeoutId!==void 0&&clearTimeout(i.timeoutId),i.resolve()}),this._consumers={},this._nextConsumerId=1}};function Ae(a=0){let e,t=new Promise(r=>{e=setTimeout(r,a)});return{timeoutId:e,promise:t}}var w=class{_mainStream;constructor(){this._mainStream=new Q}write(e,t){this._write(e,t,!1)}close(e,t){this._write(e,t,!0)}closeAll(){this._mainStream.close()}createAsyncIterator(e,t){let r=this._mainStream.createAsyncIterator(t);return{next:async()=>{for(;;){let i=await r.next();if(i.done)return i;if(i.value.name===e)return i.value.data}}}}stream(e){return new X(this,e)}_write(e,t,r){this._mainStream.write({name:e,data:{value:t,done:r}})}};var _=class{_listenerDemux;constructor(){this._listenerDemux=new w}emit(e,t){this._listenerDemux.write(e,t)}listener(e){return this._listenerDemux.stream(e)}closeListener(e){this._listenerDemux.close(e)}closeAllListeners(){this._listenerDemux.closeAll()}};function ae(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{let e=Math.random()*16|0;return(a==="x"?e:e&3|8).toString(16)})}function oe(){return Math.abs(Math.random()*Math.random()*Date.now()|0).toString()+Math.abs(Math.random()*Math.random()*Date.now()|0).toString()}function ce(a){let e=[],t=[];return function r(i,n){let s,o,c;if(typeof i=="object"&&i!==null&&!(i instanceof Boolean)&&!(i instanceof Date)&&!(i instanceof Number)&&!(i instanceof RegExp)&&!(i instanceof String)){for(s=0;s<e.length;s+=1)if(e[s]===i)return{$ref:t[s]};if(e.push(i),t.push(n),Object.prototype.toString.apply(i)==="[object Array]")for(c=[],s=0;s<i.length;s+=1)c[s]=r(i[s],n+"["+s+"]");else{c={};for(o in i)Object.prototype.hasOwnProperty.call(i,o)&&(c[o]=r(i[o],n+"["+JSON.stringify(o)+"]"))}return c}return i}(a,"$")}function S(){"use strict";return typeof function(){return this}()>"u"}var N=class extends Error{expiry;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,N.prototype),this.name="AuthTokenExpiredError",this.message=e,this.expiry=new Date(t),Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},W=class extends Error{isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,W.prototype),this.name="AuthTokenInvalidError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},B=class extends Error{date;isBadToken;constructor(e,t){super(e),Object.setPrototypeOf(this,B.prototype),this.name="AuthTokenNotBeforeError",this.message=e,this.date=t,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},D=class extends Error{expiredAt;date;isBadToken;constructor(e){super(e),Object.setPrototypeOf(this,D.prototype),this.name="AuthTokenError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},U=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,U.prototype),this.name="AuthError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},E=class extends Error{type;constructor(e,t){super(e),Object.setPrototypeOf(this,E.prototype),this.name="SilentMiddlewareBlockedError",this.message=e,this.type=t,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},u=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,u.prototype),this.name="InvalidActionError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},v=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,v.prototype),this.name="InvalidArgumentsError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},O=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,O.prototype),this.name="InvalidOptionsError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var j=class extends Error{code;constructor(e,t){super(e),Object.setPrototypeOf(this,j.prototype),this.name="SocketProtocolError",this.message=e,this.code=t,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}},L=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,L.prototype),this.name="ServerProtocolError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var H=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,H.prototype),this.name="TimeoutError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var P=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,P.prototype),this.name="BrokerError",this.message=e,Error.captureStackTrace&&!S()?Error.captureStackTrace(this,arguments.callee):this.stack=new Error().stack}};var he={1001:"Socket was disconnected",1002:"A WebSocket protocol error was encountered",1003:"Server terminated socket because it received invalid data",1005:"Socket closed without status code",1006:"Socket hung up",1007:"Message format was incorrect",1008:"Encountered a policy violation",1009:"Message was too big to process",1010:"Client ended the connection because the server did not comply with extension requirements",1011:"Server encountered an unexpected fatal condition",4e3:"Server ping timed out",4001:"Client pong timed out",4002:"Server failed to sign auth token",4003:"Failed to complete handshake",4004:"Client failed to save auth token",4005:"Did not receive #handshake from client before timeout",4006:"Failed to bind socket to message broker",4007:"Client connection establishment timed out",4008:"Server rejected handshake from client",4009:"Server received a message before the client handshake"},le={1e3:"Socket closed normally",1001:"Socket hung up"},we={domain:1,domainEmitter:1,domainThrown:1};function G(a,e){let t;if(a&&typeof a=="object"){t={message:a.message},e&&(t.stack=a.stack);for(let r in a)we[r]||(t[r]=a[r])}else typeof a=="function"?t="[function "+(a.name||"anonymous")+"]":t=a;return ce(t)}function ue(a){let e=null;if(a!=null)if(typeof a=="object"){e=new Error(a.message);for(let t in a)a.hasOwnProperty(t)&&(e[t]=a[t])}else e=a;return e}var _e=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];function De(a){let e=0,t="",r=new Uint8Array(a);for(;e<r.length;e++)t+=_e[r[e]];return t}function de(a=9){let e=new Uint8Array(a);try{return De(e)}catch{return null}}var Z=require("topgun-jsonwebtoken"),Y=class{verifyToken(e,t,r){r=r||{};let i=Object.assign({},r);return delete i.socket,typeof e=="string"||e==null?new Promise((n,s)=>{(0,Z.verify)(e,t,i).then(o=>{o?n(o):s(new D("Invalid token"))}).catch(o=>s(o))}):Promise.reject(new v("Invalid token format - Token must be a string"))}signToken(e,t,r){r=r||{};let i=Object.assign({},r);return new Promise((n,s)=>{(0,Z.sign)(e,t,i).then(o=>{o?n(o):s(new D("Sign token error"))}).catch(o=>s(o))})}};var ne={};se(ne,{decode:()=>Oe,encode:()=>Pe});var R=typeof self=="object"&&self.self===self&&self||typeof global=="object"&&global.global===global&&global||void 0;function A(){return typeof process=="object"}var ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",xe=/^[ \n\r\t]*[{\[]/,Ie=a=>{let e=new Uint8Array(a),t=e.length,r="";for(let i=0;i<t;i+=3)r+=ee[e[i]>>2],r+=ee[(e[i]&3)<<4|e[i+1]>>4],r+=ee[(e[i+1]&15)<<2|e[i+2]>>6],r+=ee[e[i+2]&63];return t%3===2?r=r.substring(0,r.length-1)+"=":t%3===1&&(r=r.substring(0,r.length-2)+"=="),r},Ce=(a,e)=>{if(R.ArrayBuffer&&e instanceof R.ArrayBuffer)return{base64:!0,data:Ie(e)};if(R.Buffer){if(e instanceof R.Buffer)return{base64:!0,data:e.toString("base64")};if(e&&e.type==="Buffer"&&Array.isArray(e.data)){let t;return R.Buffer.from?t=R.Buffer.from(e.data):t=new R.Buffer(e.data),{base64:!0,data:t.toString("base64")}}}return e};function Oe(a){if(a===null)return null;if(a==="#1"||a==="#2")return a;let e=a.toString();if(!xe.test(e))return e;try{return JSON.parse(e)}catch{}return e}function Pe(a){return a==="#1"||a==="#2"?a:A()?JSON.stringify(a,Ce):JSON.stringify(a)}var te=class{socket;id;sent;constructor(e,t){this.socket=e,this.id=t,this.sent=!1}end(e,t){if(this.id){let r={rid:this.id};e!==void 0&&(r.data=e),this._respond(r,t)}}error(e,t,r){if(this.id){let i=G(e),n={rid:this.id,error:i};t!==void 0&&(n.data=t),this._respond(n,r)}}callback(e,t,r){e?this.error(e,t,r):this.end(t,r)}_respond(e,t){if(this.sent)throw new u(`Response ${this.id} has already been sent`);this.sent=!0,this.socket.sendObject(e,t)}};function me(a){return Object.prototype.toString.call(a)==="[object Date]"}function fe(a){return!!a&&typeof a=="object"&&Object.prototype.toString.call(a)!=="[object Array]"}function V(a){if(me(a))return new Date(a.getTime());if(Array.isArray(a))return[...a].map(e=>V(e));if(a instanceof Map||a instanceof Set)return a;if(fe(a)){let e={};for(let t of Object.keys(a))e[t]=V(a[t]);return e}return a}var x=class extends _{id;server;socket;state;authState;request;remoteAddress;remoteFamily;remotePort;forwardedForAddress;channelSubscriptions;channelSubscriptionsCount;authToken;signedAuthToken;exchange;_handshakeTimeoutRef;CONNECTING=x.CONNECTING;OPEN=x.OPEN;CLOSED=x.CLOSED;AUTHENTICATED=x.AUTHENTICATED;UNAUTHENTICATED=x.UNAUTHENTICATED;_autoAckRPCs;_callbackMap;_pingIntervalTicker;_receiverDemux;_procedureDemux;_cid;_batchSendList;_pingTimeoutTicker;_batchTimeout;constructor(e,t,r){super(),this._autoAckRPCs={"#publish":1},this.id=e,this.server=t,this.socket=r,this.state=this.CONNECTING,this.authState=this.UNAUTHENTICATED,this._receiverDemux=new w,this._procedureDemux=new w,this.request=this.socket.upgradeReq||{},this.request.connection?(this.remoteAddress=this.request.connection.remoteAddress,this.remoteFamily=this.request.connection.remoteFamily,this.remotePort=this.request.connection.remotePort):(this.remoteAddress=this.request.remoteAddress,this.remoteFamily=this.request.remoteFamily,this.remotePort=this.request.remotePort),this.request.forwardedForAddress&&(this.forwardedForAddress=this.request.forwardedForAddress),this._cid=1,this._callbackMap={},this._batchSendList=[],this.channelSubscriptions={},this.channelSubscriptionsCount=0,this._on("error",async i=>{this.emitError(i)}),this._on("close",async(i,n)=>{let s=n&&n.toString();this._onClose(i,s)}),this.server.pingTimeoutDisabled||(this._pingIntervalTicker=setInterval(this._sendPing.bind(this),this.server.pingInterval)),this._resetPongTimeout(),this._on("message",async i=>{let n=A()?i:i.data;this._resetPongTimeout(),this.emit("message",{message:n});let s;try{s=this.decode(n)}catch(o){o.name==="Error"&&(o.name="InvalidMessageError"),this.emitError(o);return}if(s==="#2"){let o=this.getAuthToken();this.server.isAuthTokenExpired(o)&&this.deauthenticate()}else if(Array.isArray(s)){let o=s.length;for(let c=0;c<o;c++)this._handleRemoteEventObject(s[c],n)}else this._handleRemoteEventObject(s,n)})}receiver(e){return this._receiverDemux.stream(e)}closeReceiver(e){this._receiverDemux.close(e)}procedure(e){return this._procedureDemux.stream(e)}closeProcedure(e){this._procedureDemux.close(e)}getState(){return this.state}getBytesReceived(){return this.socket?.bytesReceived}emitError(e){this.emit("error",{error:e})}disconnect(e,t){if(e=e||1e3,typeof e!="number"){let r=new v("If specified, the code argument must be a number");this.emitError(r)}this.state!==this.CLOSED&&(this._onClose(e,t),this.socket.close(e,t))}terminate(){this.socket.terminate()}send(e,t){A()?this.socket.send(e,t,r=>{r&&this._onClose(1006,r.toString())}):this.socket.send(e)}decode(e){return this.server.codec.decode(e)}encode(e){return this.server.codec.encode(e)}sendObjectBatch(e){this._batchSendList.push(e),!this._batchTimeout&&(this._batchTimeout=setTimeout(()=>{if(delete this._batchTimeout,this._batchSendList.length){let t;try{t=this.encode(this._batchSendList)}catch(r){this.emitError(r)}t!=null&&this.send(t),this._batchSendList=[]}},this.server.options.pubSubBatchDuration||0))}sendObjectSingle(e){let t;try{t=this.encode(e)}catch(r){this.emitError(r)}t!=null&&this.send(t)}sendObject(e,t){t&&t.batch?this.sendObjectBatch(e):this.sendObjectSingle(e)}transmit(e,t,r){return this.server.verifyOutboundEvent(this,e,t,r,(i,n)=>{let s={event:e};n!==void 0&&(s.data=n),i||(r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(s))}),Promise.resolve()}invoke(e,t,r){return new Promise((i,n)=>{this.server.verifyOutboundEvent(this,e,t,r,(s,o)=>{if(s){n(s);return}let c={event:e,cid:this._nextCallId()};o!==void 0&&(c.data=o);let f=setTimeout(()=>{let b=new H(`Event response for "${e}" timed out`);delete this._callbackMap[c.cid],n(b)},this.server.ackTimeout);this._callbackMap[c.cid]={callback:(b,T)=>{if(b){n(b);return}i(T)},timeout:f},r&&r.useCache&&r.stringifiedData!=null?this.send(r.stringifiedData):this.sendObject(c)})})}triggerAuthenticationEvents(e){if(e!==this.AUTHENTICATED){let t={oldAuthState:e,newAuthState:this.authState,authToken:this.authToken};this.emit("authStateChange",t),this.server.emit("authenticationStateChange",{socket:this,...t})}this.emit("authenticate",{authToken:this.authToken}),this.server.emit("authentication",{socket:this,authToken:this.authToken})}async setAuthToken(e,t){let r=V(e),i=this.authState;if(this.authState=this.AUTHENTICATED,t==null)t={};else if(t=V(t),t.algorithm!=null){delete t.algorithm;let l=new v("Cannot change auth token algorithm at runtime - It must be specified as a config option on launch");this.emitError(l)}t.mutatePayload=!0;let n=t.rejectOnFailedDelivery;delete t.rejectOnFailedDelivery;let s=this.server.defaultSignatureOptions,o;t.expiresIn==null?o=s.expiresIn:o=t.expiresIn,r?r.exp==null?t.expiresIn=o:delete t.expiresIn:t.expiresIn=o,s.algorithm!=null&&(t.algorithm=s.algorithm),this.authToken=r;let c=l=>{throw this.emitError(l),this._onClose(4002,l.toString()),this.socket.close(4002),l},f=async l=>{let h={token:l};try{return await this.invoke("#setAuthToken",h)}catch(d){throw new U(`Failed to deliver auth token to client - ${d}`)}},b;try{b=this.server.auth.signToken(r,this.server.signatureKey,t)}catch(l){c(l)}let T;if(b instanceof Promise)try{T=await b}catch(l){c(l)}else T=b;this.authToken===r&&(this.signedAuthToken=T,this.emit("authTokenSigned",{signedAuthToken:T})),this.triggerAuthenticationEvents(i);try{await f(T)}catch(l){if(this.emitError(l),n)throw l}}getAuthToken(){return this.authToken}deauthenticateSelf(){let e=this.authState,t=this.authToken;if(this.signedAuthToken=null,this.authToken=null,this.authState=this.UNAUTHENTICATED,e!==this.UNAUTHENTICATED){let r={oldAuthState:e,newAuthState:this.authState};this.emit("authStateChange",r),this.server.emit("authenticationStateChange",{socket:this,...r})}this.emit("deauthenticate",{oldAuthToken:t}),this.server.emit("deauthentication",{socket:this,oldAuthToken:t})}deauthenticate(){return this.deauthenticateSelf(),this.invoke("#removeAuthToken")}kickOut(e,t){return e==null?Object.keys(this.channelSubscriptions).forEach(r=>{delete this.channelSubscriptions[r],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:r})}):(delete this.channelSubscriptions[e],this.channelSubscriptionsCount--,this.transmit("#kickOut",{message:t,channel:e})),this.server.brokerEngine.unsubscribeSocket(this,e)}subscriptions(){return Object.keys(this.channelSubscriptions)}isSubscribed(e){return!!this.channelSubscriptions[e]}_onClose(e,t){if(clearInterval(this._pingIntervalTicker),clearTimeout(this._pingTimeoutTicker),this.state!==this.CLOSED){let r=this.state;if(this.state=this.CLOSED,r===this.CONNECTING?this.emit("connectAbort",{code:e,reason:t}):this.emit("disconnect",{code:e,reason:t}),this.emit("close",{code:e,reason:t}),!x.ignoreStatuses[e]){let i;if(t){let s;if(typeof t=="object")try{s=JSON.stringify(t)}catch{s=t.toString()}else s=t;i=`Socket connection closed with status code ${e} and reason: ${s}`}else i=`Socket connection closed with status code ${e}`;let n=new j(x.errorStatuses[e]||i,e);this.emitError(n)}}}_sendPing(){this.state!==this.CLOSED&&this.sendObject("#1")}_handleRemoteEventObject(e,t){if(e&&e.event!=null){let r=e.event,i={socket:this,event:r,data:e.data};if(e.cid==null)this.server.verifyInboundRemoteEvent(i,(n,s)=>{n||this._receiverDemux.write(r,s)});else{i.cid=e.cid;let n=new te(this,i.cid);this.server.verifyInboundRemoteEvent(i,(s,o,c)=>{s?n.error(s):this._autoAckRPCs[r]?c!==void 0?n.end(c):n.end():this._procedureDemux.write(r,{data:o,end:f=>{n.end(f)},error:f=>{n.error(f)}})})}}else if(e&&e.rid!=null){let r=this._callbackMap[e.rid];if(r){clearTimeout(r.timeout),delete this._callbackMap[e.rid];let i=ue(e.error);r.callback(i,e.data)}}else this.emit("raw",{message:t})}_resetPongTimeout(){this.server.pingTimeoutDisabled||(clearTimeout(this._pingTimeoutTicker),this._pingTimeoutTicker=setTimeout(()=>{this._onClose(4001),this.socket.close(4001)},this.server.pingTimeout))}_nextCallId(){return this._cid++}_on(e,t){A()?this.socket.on(e,t):this.socket.addEventListener(e,t)}},k=x;g(k,"CONNECTING","connecting"),g(k,"OPEN","open"),g(k,"CLOSED","closed"),g(k,"AUTHENTICATED","authenticated"),g(k,"UNAUTHENTICATED","unauthenticated"),g(k,"ignoreStatuses",le),g(k,"errorStatuses",he);async function Re(a,e){for(let t=0;t<a.length;t++)await e(a[t],t,a)}async function I(a,...e){let t=typeof e[e.length-1]=="function"?e.pop():()=>{},r=null,i=[];return await Re(a,async n=>{if(!r)try{let s=await n(...e);i.push(s)}catch(s){i.push(void 0),r=s}}),t(r,i),i}var J=class extends C{PENDING;SUBSCRIBED;UNSUBSCRIBED;name;client;_pendingSubscriptionCid;_eventDemux;_dataStream;constructor(e,t,r,i){super(),this.PENDING=J.PENDING,this.SUBSCRIBED=J.SUBSCRIBED,this.UNSUBSCRIBED=J.UNSUBSCRIBED,this.name=e,this.client=t,this._eventDemux=r,this._dataStream=i}get state(){return this.client.getChannelState(this.name)}set state(e){throw new Error("Cannot directly set channel state")}get options(){return this.client.getChannelOptions(this.name)}set options(e){throw new Error("Cannot directly set channel options")}createAsyncIterator(e){return this._dataStream.createAsyncIterator(e)}listener(e){return this._eventDemux.stream(`${this.name}/${e}`)}closeListener(e){this._eventDemux.close(`${this.name}/${e}`)}closeAllListeners(){this._eventDemux.closeAll()}close(){this.client.closeChannel(this.name)}subscribe(e){this.client.subscribe(this.name,e)}unsubscribe(){this.client.unsubscribe(this.name)}isSubscribed(e){return this.client.isSubscribed(this.name,e)}publish(e){return this.client.publish(this.name,e)}},p=J;g(p,"PENDING","pending"),g(p,"SUBSCRIBED","subscribed"),g(p,"UNSUBSCRIBED","unsubscribed");var ie=class extends _{_broker;_channelMap;_channelEventDemux;_channelDataDemux;constructor(e){super(),this._broker=e,this._channelMap={},this._channelEventDemux=new w,this._channelDataDemux=new w,(async()=>{for await(let{channel:t,data:r}of this._broker.listener("publish"))this._channelDataDemux.write(t,r)})()}destroy(){this._broker.closeAllListeners()}publish(e,t){return this._broker.publish(e,t)}subscribe(e){let t=this._channelMap[e];t||(t={name:e,state:p.PENDING},this._channelMap[e]=t,this._triggerChannelSubscribe(t));let r=this._channelDataDemux.stream(e);return new p(e,this,this._channelEventDemux,r)}unsubscribe(e){let t=this._channelMap[e];t&&this._triggerChannelUnsubscribe(t)}channel(e){let t=this._channelDataDemux.stream(e);return new p(e,this,this._channelEventDemux,t)}getChannelState(e){let t=this._channelMap[e];return t?t.state:p.UNSUBSCRIBED}getChannelOptions(e){return{}}subscriptions(e){let t=[];return Object.keys(this._channelMap).forEach(r=>{(e||this._channelMap[r].state===p.SUBSCRIBED)&&t.push(r)}),t}isSubscribed(e,t){let r=this._channelMap[e];return t?!!r:!!r&&r.state===p.SUBSCRIBED}_triggerChannelSubscribe(e){let t=e.name;e.state=p.SUBSCRIBED,this._channelEventDemux.write(`${t}/subscribe`,{}),this.emit("subscribe",{channel:t})}_triggerChannelUnsubscribe(e){let t=e.name;delete this._channelMap[t],e.state===p.SUBSCRIBED&&(this._channelEventDemux.write(`${t}/unsubscribe`,{}),this.emit("unsubscribe",{channel:t}))}};var re=class extends _{isReady;_exchangeClient;_clientSubscribers;_clientSubscribersCounter;constructor(){super(),this.isReady=!1,this._exchangeClient=new ie(this),this._clientSubscribers={},this._clientSubscribersCounter={},setTimeout(()=>{this.isReady=!0,this.emit("ready",{})},0)}exchange(){return this._exchangeClient}subscribeSocket(e,t){return this._clientSubscribers[t]||(this._clientSubscribers[t]={},this._clientSubscribersCounter[t]=0),this._clientSubscribers[t][e.id]||(this._clientSubscribersCounter[t]++,this.emit("subscribe",{channel:t})),this._clientSubscribers[t][e.id]=e,Promise.resolve()}unsubscribeSocket(e,t){return this._clientSubscribers[t]&&this._clientSubscribers[t][e.id]&&(this._clientSubscribersCounter[t]--,delete this._clientSubscribers[t][e.id],this._clientSubscribersCounter[t]<=0&&(delete this._clientSubscribers[t],delete this._clientSubscribersCounter[t],this.emit("unsubscribe",{channel:t}))),Promise.resolve()}subscriptions(){return Object.keys(this._clientSubscribers)}isSubscribed(e){return!!this._clientSubscribers[e]}publish(e,t,r){let i={channel:e,data:t},n=this._clientSubscribers[e]||{};return Object.keys(n).forEach(s=>{n[s].transmit("#publish",i)}),r||this.emit("publish",i),Promise.resolve()}};var $=class extends _{options;MIDDLEWARE_HANDSHAKE_WS;MIDDLEWARE_HANDSHAKE_AG;MIDDLEWARE_TRANSMIT;MIDDLEWARE_INVOKE;MIDDLEWARE_SUBSCRIBE;MIDDLEWARE_PUBLISH_IN;MIDDLEWARE_PUBLISH_OUT;MIDDLEWARE_AUTHENTICATE;origins;ackTimeout;handshakeTimeout;pingInterval;pingTimeout;pingTimeoutDisabled;allowClientPublish;perMessageDeflate;httpServer;socketChannelLimit;brokerEngine;appName;middlewareEmitWarnings;isReady;signatureKey;verificationKey;authVerifyAsync;authSignAsync;defaultVerificationOptions;defaultSignatureOptions;auth;codec;clients;clientsCount;pendingClients;pendingClientsCount;exchange;_middleware;_allowAllOrigins;wsServer;_path;constructor(e){super();let t={brokerEngine:new re,wsEngine:"ws",wsEngineServerOptions:{},maxPayload:null,allowClientPublish:!0,ackTimeout:1e4,handshakeTimeout:1e4,pingTimeout:2e4,pingTimeoutDisabled:!1,pingInterval:8e3,origins:"*:*",appName:ae(),path:"/topgunsocket/",authDefaultExpiry:86400,authSignAsync:!1,authVerifyAsync:!0,pubSubBatchDuration:null,middlewareEmitWarnings:!0};this.options=Object.assign(t,e||{}),this.MIDDLEWARE_HANDSHAKE_WS="handshakeWS",this.MIDDLEWARE_HANDSHAKE_AG="handshakeAG",this.MIDDLEWARE_TRANSMIT="transmit",this.MIDDLEWARE_INVOKE="invoke",this.MIDDLEWARE_SUBSCRIBE="subscribe",this.MIDDLEWARE_PUBLISH_IN="publishIn",this.MIDDLEWARE_PUBLISH_OUT="publishOut",this.MIDDLEWARE_AUTHENTICATE="authenticate",this._middleware={},this._middleware[this.MIDDLEWARE_HANDSHAKE_WS]=[],this._middleware[this.MIDDLEWARE_HANDSHAKE_AG]=[],this._middleware[this.MIDDLEWARE_TRANSMIT]=[],this._middleware[this.MIDDLEWARE_INVOKE]=[],this._middleware[this.MIDDLEWARE_SUBSCRIBE]=[],this._middleware[this.MIDDLEWARE_PUBLISH_IN]=[],this._middleware[this.MIDDLEWARE_PUBLISH_OUT]=[],this._middleware[this.MIDDLEWARE_AUTHENTICATE]=[],this.origins=t.origins,this._allowAllOrigins=this.origins.indexOf("*:*")!==-1,this.ackTimeout=t.ackTimeout,this.handshakeTimeout=t.handshakeTimeout,this.pingInterval=t.pingInterval,this.pingTimeout=t.pingTimeout,this.pingTimeoutDisabled=t.pingTimeoutDisabled,this.allowClientPublish=t.allowClientPublish,this.perMessageDeflate=t.perMessageDeflate,this.httpServer=t.httpServer,this.socketChannelLimit=t.socketChannelLimit,this.brokerEngine=t.brokerEngine,this.appName=t.appName||"",this.middlewareEmitWarnings=t.middlewareEmitWarnings,this._path=t.path.replace(/\/?$/,"/").replace(/^\/?/,"/"),this.brokerEngine.isReady?(this.isReady=!0,this.emit("ready",{})):(this.isReady=!1,(async()=>(await this.brokerEngine.listener("ready").once(),this.isReady=!0,this.emit("ready",{})))());let r=typeof t.wsEngine=="string"?require(t.wsEngine):t.wsEngine;if(!r||!r.Server)throw new O("The wsEngine option must be a path or module name which points to a valid WebSocket engine module with a compatible interface");let i=r.Server;if(t.authPrivateKey!=null||t.authPublicKey!=null){if(t.authPrivateKey==null)throw new O("The authPrivateKey option must be specified if authPublicKey is specified");if(t.authPublicKey==null)throw new O("The authPublicKey option must be specified if authPrivateKey is specified");this.signatureKey=t.authPrivateKey,this.verificationKey=t.authPublicKey}else t.authKey==null&&(t.authKey=de(32)),this.signatureKey=t.authKey,this.verificationKey=t.authKey;this.authVerifyAsync=t.authVerifyAsync,this.authSignAsync=t.authSignAsync,this.defaultVerificationOptions={async:this.authVerifyAsync},t.authVerifyAlgorithms!=null?this.defaultVerificationOptions.algorithms=t.authVerifyAlgorithms:t.authAlgorithm!=null&&(this.defaultVerificationOptions.algorithms=[t.authAlgorithm]),this.defaultSignatureOptions={expiresIn:t.authDefaultExpiry,async:this.authSignAsync},t.authAlgorithm!=null&&(this.defaultSignatureOptions.algorithm=t.authAlgorithm),t.authEngine?this.auth=t.authEngine:this.auth=new Y,t.codecEngine?this.codec=t.codecEngine:this.codec=ne,this.clients={},this.clientsCount=0,this.pendingClients={},this.pendingClientsCount=0,this.exchange=this.brokerEngine.exchange();let n=t.wsEngineServerOptions||{};n.server=this.httpServer,n.verifyClient=this.verifyHandshake.bind(this),n.path==null&&this._path!=null&&(n.path=this._path),n.perMessageDeflate==null&&this.perMessageDeflate!=null&&(n.perMessageDeflate=this.perMessageDeflate),n.handleProtocols==null&&t.handleProtocols!=null&&(n.handleProtocols=t.handleProtocols),n.maxPayload==null&&t.maxPayload!=null&&(n.maxPayload=t.maxPayload),n.clientTracking==null&&(n.clientTracking=!1),A()&&(this.wsServer=new i(n),this.wsServer.on("error",this._handleServerError.bind(this)),this.wsServer.on("connection",this.handleSocketConnection.bind(this)))}handleSocketConnection(e,t){!e.upgradeReq&&t&&(e.upgradeReq=t);let r=this.generateId(),i=new k(r,this,e);i.exchange=this.exchange,this._handleSocketErrors(i),this.pendingClients[r]=i,this.pendingClientsCount++,(async()=>{for await(let h of i.procedure("#authenticate")){let d=h.data;this._processAuthToken(i,d,(m,y,M)=>{if(m?y&&i.deauthenticate():i.triggerAuthenticationEvents(M),m&&y)h.error(m);else{let K={isAuthenticated:!!i.authToken,authError:G(m)};h.end(K)}})}})(),(async()=>{for await(let h of i.receiver("#removeAuthToken"))i.deauthenticateSelf()})(),(async()=>{for await(let h of i.procedure("#subscribe")){let d=h.data;d?typeof d=="string"&&(d={channel:d}):d={},(async()=>{if(i.state===i.OPEN){try{await this._subscribeSocket(i,d)}catch(y){let M=new P(`Failed to subscribe socket to the ${d.channel} channel - ${y}`);h.error(M),i.emitError(M);return}if(d.batch){h.end(void 0,{batch:!0});return}h.end();return}let m=new u("Cannot subscribe socket to a channel before it has completed the handshake");h.error(m),this.emitWarning(m)})()}})(),(async()=>{for await(let h of i.procedure("#unsubscribe")){let d=h.data,m;try{this._unsubscribeSocket(i,d)}catch(y){m=new P(`Failed to unsubscribe socket from the ${d} channel - ${y}`)}m?(h.error(m),i.emitError(m)):h.end()}})();let f=(h,d,m)=>{clearTimeout(i._handshakeTimeoutRef),i.closeProcedure("#handshake"),i.closeProcedure("#authenticate"),i.closeProcedure("#subscribe"),i.closeProcedure("#unsubscribe"),i.closeReceiver("#removeAuthToken"),i.closeListener("authenticate"),i.closeListener("authStateChange"),i.closeListener("deauthenticate"),!!this.clients[r]&&(delete this.clients[r],this.clientsCount--),!!this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),h==="disconnect"?this.emit("disconnection",{socket:i,code:d,reason:m}):h==="abort"&&this.emit("connectionAbort",{socket:i,code:d,reason:m}),this.emit("closure",{socket:i,code:d,reason:m}),this._unsubscribeSocketFromAllChannels(i)};(async()=>{let h=await i.listener("disconnect").once();f("disconnect",h.code,h.data)})(),(async()=>{let h=await i.listener("connectAbort").once();f("abort",h.code,h.data)})(),i._handshakeTimeoutRef=setTimeout(this._handleHandshakeTimeout.bind(this,i),this.handshakeTimeout),(async()=>{for await(let h of i.procedure("#handshake")){let m=(h.data||{}).authToken||null;clearTimeout(i._handshakeTimeoutRef),this._passThroughHandshakeAGMiddleware({socket:i},(y,M)=>{if(y){y.statusCode==null&&(y.statusCode=M),h.error(y),i.disconnect(y.statusCode);return}this._processAuthToken(i,m,(K,be,ye)=>{if(i.state===i.CLOSED)return;let F={id:i.id,pingTimeout:this.pingTimeout},z={id:i.id,pingTimeout:this.pingTimeout};K&&m!=null&&(F.authError=G(K),z.authError=K,be&&i.deauthenticate()),F.isAuthenticated=!!i.authToken,z.isAuthenticated=F.isAuthenticated,this.pendingClients[r]&&(delete this.pendingClients[r],this.pendingClientsCount--),this.clients[r]=i,this.clientsCount++,i.state=i.OPEN,F.isAuthenticated&&(async()=>(await this.listener("connection").once(),i.triggerAuthenticationEvents(ye)))(),i.emit("connect",z),this.emit("connection",{socket:i,...z}),h.end(F)})})}})(),this.emit("handshake",{socket:i})}setAuthEngine(e){this.auth=e}setCodecEngine(e){this.codec=e}emitError(e){this.emit("error",{error:e})}emitWarning(e){this.emit("warning",{warning:e})}close(e){return this.isReady=!1,new Promise((t,r)=>{if(A()){if(this.wsServer.close(i=>{if(i){r(i);return}t()}),!e)for(let i of Object.values(this.clients))i.terminate()}else for(let i of Object.values(this.clients))i.disconnect(1011,"WebSocket broken.")})}getPath(){return this._path}generateId(){return oe()}addMiddleware(e,t){if(!this._middleware[e])throw new v(`Middleware type "${e}" is not supported`);this._middleware[e].push(t)}removeMiddleware(e,t){let r=this._middleware[e];this._middleware[e]=r.filter(i=>i!==t)}async verifyHandshake(e,t){let r=e.req,i=e.origin;(i==="null"||i==null)&&(i="*");let n=!1;if(this._allowAllOrigins)n=!0;else try{let s=new URL(i),o=s.port||(s.protocol==="https:"?443:80);n=~this.origins.indexOf(s.hostname+":"+o)||~this.origins.indexOf(s.hostname+":*")||~this.origins.indexOf("*:"+o)}catch{}if(n){let s=this._middleware[this.MIDDLEWARE_HANDSHAKE_WS];if(s.length){let o=!1;await I(s,r,c=>{o?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_HANDSHAKE_WS} middleware was already invoked`)):(o=!0,c?(c===!0||c.silent?c=new E(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_WS} middleware`,this.MIDDLEWARE_HANDSHAKE_WS):this.middlewareEmitWarnings&&this.emitWarning(c),t(!1,401,typeof c=="string"?c:c.message)):t(!0))})}else t(!0)}else{let s=new L(`Failed to authorize socket handshake - Invalid origin: ${i}`);this.emitWarning(s),t(!1,403,s.message)}}verifyInboundRemoteEvent(e,t){let r=e.socket,i=r.getAuthToken();this.isAuthTokenExpired(i)&&(e.authTokenExpiredError=new N("The socket auth token has expired",i.exp),r.deauthenticate()),this._passThroughMiddleware(e,t)}isAuthTokenExpired(e){if(e&&e.exp!=null){let t=Date.now(),r=e.exp*1e3;return t>r}return!1}async verifyOutboundEvent(e,t,r,i,n){let s=!1;if(t==="#publish"){let o={socket:e,channel:r.channel,data:r.data};await I(this._middleware[this.MIDDLEWARE_PUBLISH_OUT],o,c=>{s?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_PUBLISH_OUT} middleware was already invoked`)):(s=!0,o.data!==void 0&&(r.data=o.data),c?(c===!0||c.silent?c=new E(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_OUT} middleware`,this.MIDDLEWARE_PUBLISH_OUT):this.middlewareEmitWarnings&&this.emitWarning(c),n(c,r)):(i&&o.useCache&&(i.useCache=!0),n(null,r)))})}else n(null,r)}async _processSubscribeAction(e,t,r){let i=!1,n=e.data||{};t.channel=n.channel,t.waitForAuth=n.waitForAuth,t.data=n.data,t.waitForAuth&&t.authTokenExpiredError?r(t.authTokenExpiredError,n):await I(this._middleware[this.MIDDLEWARE_SUBSCRIBE],t,s=>{i?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_SUBSCRIBE} middleware was already invoked`)):(i=!0,s&&(s===!0||s.silent?s=new E(`Action was silently blocked by ${this.MIDDLEWARE_SUBSCRIBE} middleware`,this.MIDDLEWARE_SUBSCRIBE):this.middlewareEmitWarnings&&this.emitWarning(s)),t.data!==void 0&&(n.data=t.data),r(s,n))})}async _processTransmitAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await I(this._middleware[this.MIDDLEWARE_TRANSMIT],t,n=>{i?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_TRANSMIT} middleware was already invoked`)):(i=!0,n&&(n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_TRANSMIT} middleware`,this.MIDDLEWARE_TRANSMIT):this.middlewareEmitWarnings&&this.emitWarning(n)),r(n,t.data))})}async _processPublishAction(e,t,r){let i=!1;if(this.allowClientPublish){let n=e.data||{};t.channel=n.channel,t.data=n.data,await I(this._middleware[this.MIDDLEWARE_PUBLISH_IN],t,s=>{if(i)this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_PUBLISH_IN} middleware was already invoked`));else if(i=!0,t.data!==void 0&&(n.data=t.data),s)s===!0||s.silent?s=new E(`Action was silently blocked by ${this.MIDDLEWARE_PUBLISH_IN} middleware`,this.MIDDLEWARE_PUBLISH_IN):this.middlewareEmitWarnings&&this.emitWarning(s),r(s,n,t.ackData);else{if(typeof t.channel!="string"){s=new P(`Socket ${t.socket.id} tried to publish to an invalid ${t.channel} channel`),this.emitWarning(s),r(s,n,t.ackData);return}(async()=>{let o;try{await this.exchange.publish(t.channel,t.data)}catch(c){o=c,this.emitWarning(o)}r(o,n,t.ackData)})()}})}else{let n=new u("Client publish feature is disabled");this.emitWarning(n),r(n)}}async _processInvokeAction(e,t,r){let i=!1;t.event=e.event,t.data=e.data,await I(this._middleware[this.MIDDLEWARE_INVOKE],t,n=>{i?this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_INVOKE} middleware was already invoked`)):(i=!0,n&&(n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_INVOKE} middleware`,this.MIDDLEWARE_INVOKE):this.middlewareEmitWarnings&&this.emitWarning(n)),r(n,t.data))})}_passThroughMiddleware(e,t){let r={socket:e.socket};e.authTokenExpiredError!=null&&(r.authTokenExpiredError=e.authTokenExpiredError);let i=e.event;if(e.cid==null)if(this._isReservedRemoteEvent(i))if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#removeAuthToken")t(null,e.data);else{let n=new u(`The reserved transmitted event ${i} is not supported`);t(n)}else this._processTransmitAction(e,r,t);else if(this._isReservedRemoteEvent(i))if(i==="#subscribe")this._processSubscribeAction(e,r,t);else if(i==="#publish")this._processPublishAction(e,r,t);else if(i==="#handshake"||i==="#authenticate"||i==="#unsubscribe")t(null,e.data);else{let n=new u(`The reserved invoked event ${i} is not supported`);t(n)}else this._processInvokeAction(e,r,t)}_isReservedRemoteEvent(e){return typeof e=="string"&&e.indexOf("#")===0}_handleServerError(e){typeof e=="string"&&(e=new L(e)),this.emitError(e)}_handleHandshakeTimeout(e){e.disconnect(4005)}async _handleSocketErrors(e){for await(let t of e.listener("error"))this.emitWarning(t.error)}async _subscribeSocket(e,t){if(!t)throw new u(`Socket ${e.id} provided a malformated channel payload`);if(this.socketChannelLimit&&e.channelSubscriptionsCount>=this.socketChannelLimit)throw new u(`Socket ${e.id} tried to exceed the channel subscription limit of ${this.socketChannelLimit}`);let r=t.channel;if(typeof r!="string")throw new u(`Socket ${e.id} provided an invalid channel name`);e.channelSubscriptionsCount==null&&(e.channelSubscriptionsCount=0),e.channelSubscriptions[r]==null&&(e.channelSubscriptions[r]=!0,e.channelSubscriptionsCount++);try{await this.brokerEngine.subscribeSocket(e,r)}catch(i){throw delete e.channelSubscriptions[r],e.channelSubscriptionsCount--,i}e.emit("subscribe",{channel:r,subscribeOptions:t}),this.emit("subscription",{socket:e,channel:r,subscribeOptions:t})}_unsubscribeSocketFromAllChannels(e){Object.keys(e.channelSubscriptions).forEach(t=>{this._unsubscribeSocket(e,t)})}_unsubscribeSocket(e,t){if(typeof t!="string")throw new u(`Socket ${e.id} tried to unsubscribe from an invalid channel name`);if(!e.channelSubscriptions[t])throw new u(`Socket ${e.id} tried to unsubscribe from a channel which it is not subscribed to`);delete e.channelSubscriptions[t],e.channelSubscriptionsCount!=null&&e.channelSubscriptionsCount--,this.brokerEngine.unsubscribeSocket(e,t),e.emit("unsubscribe",{channel:t}),this.emit("unsubscription",{socket:e,channel:t})}_processTokenError(e){let t=null,r=!0;return e&&(e.name==="TokenExpiredError"?t=new N(e.message,e.expiredAt):e.name==="JsonWebTokenError"?t=new W(e.message):e.name==="NotBeforeError"?(t=new B(e.message,e.date),r=!1):t=new D(e.message)),{authError:t,isBadToken:r}}_emitBadAuthTokenError(e,t,r){e.emit("badAuthToken",{authError:t,signedAuthToken:r}),this.emit("badSocketAuthToken",{socket:e,authError:t,signedAuthToken:r})}_processAuthToken(e,t,r){let i=Object.assign({socket:e},this.defaultVerificationOptions),n=c=>{let f=c.error,b=c.token,T=e.authState;if(b?(e.signedAuthToken=t,e.authToken=b,e.authState=e.AUTHENTICATED):(e.signedAuthToken=null,e.authToken=null,e.authState=e.UNAUTHENTICATED),e.authToken)this._passThroughAuthenticateMiddleware({socket:e,signedAuthToken:e.signedAuthToken,authToken:e.authToken},(l,h)=>{l&&(e.authToken=null,e.authState=e.UNAUTHENTICATED,h&&this._emitBadAuthTokenError(e,l,t)),r(l,h||!1,T)});else{let l=this._processTokenError(f);f&&t!=null&&(e.emitError(l.authError),l.isBadToken&&this._emitBadAuthTokenError(e,l.authError,t)),r(l.authError,l.isBadToken,T)}},s,o;try{s=this.auth.verifyToken(t,this.verificationKey,i)}catch(c){o=c}s instanceof Promise?(async()=>{let c={};try{c.token=await s}catch(f){c.error=f}n(c)})():n({token:s,error:o})}async _passThroughAuthenticateMiddleware(e,t){let r=!1,i={socket:e.socket,authToken:e.authToken};await I(this._middleware[this.MIDDLEWARE_AUTHENTICATE],i,(n,s)=>{if(r)this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_AUTHENTICATE} middleware was already invoked`));else{r=!0;let o=!1;s.length&&(o=s[s.length-1]||!1),n&&(n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_AUTHENTICATE} middleware`,this.MIDDLEWARE_AUTHENTICATE):this.middlewareEmitWarnings&&this.emitWarning(n)),t(n,o)}})}async _passThroughHandshakeAGMiddleware(e,t){let r=!1,i={socket:e.socket};await I(this._middleware[this.MIDDLEWARE_HANDSHAKE_AG],i,(n,s)=>{if(r)this.emitWarning(new u(`Callback for ${this.MIDDLEWARE_HANDSHAKE_AG} middleware was already invoked`));else{r=!0;let o;s.length?o=s[s.length-1]||4008:o=4008,n&&(n.statusCode!=null&&(o=n.statusCode),n===!0||n.silent?n=new E(`Action was silently blocked by ${this.MIDDLEWARE_HANDSHAKE_AG} middleware`,this.MIDDLEWARE_HANDSHAKE_AG):this.middlewareEmitWarnings&&this.emitWarning(n)),t(n,o)}})}};function pe(a,e){return e=e||{},e.httpServer=a,new $(e)}function Me(a,e,t){if(typeof e=="function"&&(t=e,e={}),A()){let i=require("http").createServer(),n=pe(i,e);return n.httpServer=i,n.httpServer.listen(a,t),n}else return new $(e)}0&&(module.exports={TGSocket,TGSocketServer,attach,listen});
{
"name": "topgun-socket",
"version": "1.4.2",
"version": "1.4.3",
"description": "Scalable realtime pub/sub and RPC serverless framework",

@@ -5,0 +5,0 @@ "publishConfig": {

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc