@tangle-network/sandbox 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +490 -2
- package/dist/auth/index.d.ts +2 -2
- package/dist/auth/index.js +271 -1
- package/dist/client-Uve6A5C6.js +2280 -0
- package/dist/collaboration/index.d.ts +1 -1
- package/dist/collaboration/index.js +2 -1
- package/dist/collaboration-CRyb5e8F.js +201 -0
- package/dist/core.d.ts +3 -3
- package/dist/core.js +4 -1
- package/dist/errors-BI75IXOM.d.ts +1177 -0
- package/dist/errors-CljiGR__.js +262 -0
- package/dist/{index-BuS8nl3b.d.ts → index-CCsA3S0D.d.ts} +6 -1
- package/dist/{index-t7xkzv0U.d.ts → index-DhNGZ0h4.d.ts} +3 -3
- package/dist/{index-gA-oRjOi.d.ts → index-Dpj1oB5i.d.ts} +35 -4
- package/dist/index.d.ts +109 -62
- package/dist/index.js +825 -1
- package/dist/openai/index.d.ts +642 -0
- package/dist/openai/index.js +1721 -0
- package/dist/platform-integrations.d.ts +2 -0
- package/dist/platform-integrations.js +2 -0
- package/dist/{sandbox-BvZ0-Iv7.d.ts → sandbox-aBpWqler.d.ts} +1528 -41
- package/dist/sandbox-ksXTNlo-.js +3394 -0
- package/dist/session-gateway/index.js +667 -1
- package/dist/tangle/index.d.ts +1 -1
- package/dist/tangle/index.js +2 -1
- package/dist/tangle-DQ05paN7.js +826 -0
- package/package.json +93 -34
- package/LICENSE +0 -11
- package/dist/client-CcRvqt85.js +0 -1
- package/dist/collaboration-CVvhPU8M.js +0 -1
- package/dist/errors-AIT8qikt.d.ts +0 -491
- package/dist/errors-CdMTv7uG.js +0 -1
- package/dist/sandbox-D1JnQIJx.js +0 -1
- package/dist/tangle-CSb9rjAh.js +0 -1
|
@@ -1 +1,667 @@
|
|
|
1
|
-
const a0_0x544454=a0_0x4306;(function(_0x25b3ad,_0x56356c){const _0x388ba9=a0_0x4306,_0x41868a=_0x25b3ad();while(!![]){try{const _0x3eb7ce=-parseInt(_0x388ba9(0xb9))/0x1+parseInt(_0x388ba9(0x15e))/0x2*(-parseInt(_0x388ba9(0x110))/0x3)+parseInt(_0x388ba9(0xe8))/0x4*(parseInt(_0x388ba9(0x181))/0x5)+parseInt(_0x388ba9(0x16e))/0x6+parseInt(_0x388ba9(0xc5))/0x7*(-parseInt(_0x388ba9(0x16b))/0x8)+-parseInt(_0x388ba9(0xe0))/0x9*(-parseInt(_0x388ba9(0x142))/0xa)+parseInt(_0x388ba9(0x173))/0xb;if(_0x3eb7ce===_0x56356c)break;else _0x41868a['push'](_0x41868a['shift']());}catch(_0x2e11f0){_0x41868a['push'](_0x41868a['shift']());}}}(a0_0x5ae1,0x8338d));const INITIAL_METRICS={'\x6c\x61\x73\x74\x50\x69\x6e\x67\x4c\x61\x74\x65\x6e\x63\x79\x4d\x73':null,'\x61\x76\x67\x50\x69\x6e\x67\x4c\x61\x74\x65\x6e\x63\x79\x4d\x73':null,'\x6d\x69\x73\x73\x65\x64\x50\x6f\x6e\x67\x43\x6f\x75\x6e\x74':0x0,'\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x43\x6f\x75\x6e\x74':0x0,'\x6c\x61\x73\x74\x50\x6f\x6e\x67\x41\x74':null,'\x6c\x61\x73\x74\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74':null,'\x71\x75\x61\x6c\x69\x74\x79':a0_0x544454(0x114)};function calculateConnectionQuality(_0xd03a1c,_0x4be5a9){const _0x44c2a7=a0_0x544454,_0xeef03f={'\x62\x55\x6d\x43\x43':_0x44c2a7(0x114),'\x45\x66\x56\x69\x79':function(_0x2637b6,_0x4c50d7){return _0x2637b6-_0x4c50d7;},'\x5a\x57\x76\x64\x4b':function(_0x1374ce,_0x11fcb1){return _0x1374ce>=_0x11fcb1;},'\x56\x4c\x42\x71\x74':function(_0x56093a,_0x2067b5){return _0x56093a>_0x2067b5;},'\x51\x72\x4f\x69\x6f':'\x70\x6f\x6f\x72','\x41\x54\x5a\x71\x6c':function(_0x47aecf,_0x4410ec){return _0x47aecf>_0x4410ec;},'\x4b\x48\x52\x69\x6f':function(_0x473426,_0xc6312c){return _0x473426!==_0xc6312c;},'\x74\x6e\x4b\x56\x56':function(_0x38d2d5,_0x9f0a7a){return _0x38d2d5===_0x9f0a7a;},'\x45\x71\x58\x51\x78':function(_0x43b96b,_0x12f6e2){return _0x43b96b<=_0x12f6e2;},'\x4c\x5a\x55\x54\x68':_0x44c2a7(0xb3)};if(!_0x4be5a9)return _0xeef03f['\x62\x55\x6d\x43\x43'];const {avgPingLatencyMs:_0x303f06,missedPongCount:_0x87a7a1,reconnectCount:_0x337194,lastReconnectAt:_0x19be9b}=_0xd03a1c,_0x173e2a=_0x19be9b&&_0xeef03f['\x45\x66\x56\x69\x79'](Date['\x6e\x6f\x77'](),_0x19be9b)<0x12c*0x3e8;if(_0xeef03f[_0x44c2a7(0x9a)](_0x87a7a1,0x2)||_0x173e2a&&_0xeef03f[_0x44c2a7(0xcc)](_0x337194,0x1))return _0xeef03f[_0x44c2a7(0xae)];if(_0x87a7a1>=0x1||_0x303f06!==null&&_0xeef03f[_0x44c2a7(0xfe)](_0x303f06,0x3e8)||_0x173e2a)return'\x64\x65\x67\x72\x61\x64\x65\x64';if(_0xeef03f['\x4b\x48\x52\x69\x6f'](_0x303f06,null)&&_0x303f06<0x64&&_0xeef03f[_0x44c2a7(0x148)](_0x337194,0x0))return _0x44c2a7(0xac);if(_0x303f06!==null&&_0xeef03f[_0x44c2a7(0xad)](_0x303f06,0x12c))return _0xeef03f[_0x44c2a7(0xb0)];return _0x44c2a7(0xb3);}const DEFAULT_CONFIG={'\x74\x72\x61\x6e\x73\x70\x6f\x72\x74':a0_0x544454(0x15d),'\x63\x68\x61\x6e\x6e\x65\x6c\x73':['\x2a'],'\x61\x75\x74\x6f\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74':!![],'\x6d\x61\x78\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74\x74\x65\x6d\x70\x74\x73':0xa,'\x69\x6e\x69\x74\x69\x61\x6c\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x44\x65\x6c\x61\x79\x4d\x73':0x3e8,'\x6d\x61\x78\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x44\x65\x6c\x61\x79\x4d\x73':0x7530,'\x70\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c\x4d\x73':0x7530,'\x70\x6f\x6e\x67\x54\x69\x6d\x65\x6f\x75\x74\x4d\x73':0x2710,'\x6d\x61\x78\x4d\x69\x73\x73\x65\x64\x50\x6f\x6e\x67\x73':0x2,'\x65\x6e\x61\x62\x6c\x65\x44\x65\x64\x75\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e':!![],'\x6d\x61\x78\x44\x65\x64\x75\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x53\x69\x7a\x65':0x3e8,'\x65\x6e\x61\x62\x6c\x65\x52\x65\x70\x6c\x61\x79\x50\x65\x72\x73\x69\x73\x74\x65\x6e\x63\x65':![],'\x72\x65\x70\x6c\x61\x79\x53\x74\x6f\x72\x61\x67\x65\x4b\x65\x79\x50\x72\x65\x66\x69\x78':a0_0x544454(0x17d),'\x6c\x61\x74\x65\x6e\x63\x79\x48\x69\x73\x74\x6f\x72\x79\x53\x69\x7a\x65':0xa},STORAGE_KEYS={'\x6c\x61\x73\x74\x45\x76\x65\x6e\x74\x49\x64':a0_0x544454(0x91),'\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x49\x64':a0_0x544454(0x139),'\x73\x65\x73\x73\x69\x6f\x6e\x49\x64':'\x73\x65\x73\x73\x69\x6f\x6e\x5f\x69\x64'},WIRE_TYPE_MAP={'\x73\x69\x64\x65\x63\x61\x72\x2e\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64':a0_0x544454(0xec),'\x73\x69\x64\x65\x63\x61\x72\x2e\x64\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64':a0_0x544454(0xc0),'\x73\x69\x64\x65\x63\x61\x72\x2e\x6e\x6f\x74\x5f\x66\x6f\x75\x6e\x64':a0_0x544454(0x127),'\x73\x69\x64\x65\x63\x61\x72\x2e\x72\x65\x61\x64\x79':a0_0x544454(0x185)};function a0_0x4306(_0x416134,_0x2dae7e){_0x416134=_0x416134-0x91;const _0x5ae1c5=a0_0x5ae1();let _0x430636=_0x5ae1c5[_0x416134];if(a0_0x4306['\x45\x42\x59\x70\x54\x6c']===undefined){var _0x4eeec0=function(_0x1b3f63){const _0x48b4d8='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x3e253f='',_0x736d51='';for(let _0x337a08=0x0,_0x163b96,_0x355f96,_0x26a697=0x0;_0x355f96=_0x1b3f63['\x63\x68\x61\x72\x41\x74'](_0x26a697++);~_0x355f96&&(_0x163b96=_0x337a08%0x4?_0x163b96*0x40+_0x355f96:_0x355f96,_0x337a08++%0x4)?_0x3e253f+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0xff&_0x163b96>>(-0x2*_0x337a08&0x6)):0x0){_0x355f96=_0x48b4d8['\x69\x6e\x64\x65\x78\x4f\x66'](_0x355f96);}for(let _0x15c9c7=0x0,_0x224308=_0x3e253f['\x6c\x65\x6e\x67\x74\x68'];_0x15c9c7<_0x224308;_0x15c9c7++){_0x736d51+='\x25'+('\x30\x30'+_0x3e253f['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x15c9c7)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x10))['\x73\x6c\x69\x63\x65'](-0x2);}return decodeURIComponent(_0x736d51);};a0_0x4306['\x7a\x56\x64\x73\x62\x44']=_0x4eeec0,a0_0x4306['\x54\x4a\x57\x45\x65\x70']={},a0_0x4306['\x45\x42\x59\x70\x54\x6c']=!![];}const _0x1e46b3=_0x5ae1c5[0x0],_0x4c626f=_0x416134+_0x1e46b3,_0x312e1f=a0_0x4306['\x54\x4a\x57\x45\x65\x70'][_0x4c626f];return!_0x312e1f?(_0x430636=a0_0x4306['\x7a\x56\x64\x73\x62\x44'](_0x430636),a0_0x4306['\x54\x4a\x57\x45\x65\x70'][_0x4c626f]=_0x430636):_0x430636=_0x312e1f,_0x430636;}var MemoryStorage=class{[a0_0x544454(0x158)]=new Map();[a0_0x544454(0x106)](_0x4a09a8){const _0x21bac0=a0_0x544454;return this['\x73\x74\x6f\x72\x65'][_0x21bac0(0x123)](_0x4a09a8)??null;}[a0_0x544454(0x105)](_0x3087e0,_0x317ddd){this['\x73\x74\x6f\x72\x65']['\x73\x65\x74'](_0x3087e0,_0x317ddd);}[a0_0x544454(0xf7)](_0x25346f){const _0x323865=a0_0x544454;this['\x73\x74\x6f\x72\x65'][_0x323865(0xea)](_0x25346f);}},SessionGatewayClient=class{['\x77\x73']=null;[a0_0x544454(0x11c)];[a0_0x544454(0x168)];[a0_0x544454(0xbd)];[a0_0x544454(0x12a)]=![];[a0_0x544454(0x120)]=a0_0x544454(0x114);[a0_0x544454(0x171)]=null;[a0_0x544454(0x15f)]=![];['\x6c\x61\x73\x74\x50\x69\x6e\x67\x41\x74']=null;['\x6c\x61\x73\x74\x50\x6f\x6e\x67\x41\x74']=null;[a0_0x544454(0x9d)]=null;[a0_0x544454(0xf3)]=0x0;['\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74\x74\x65\x6d\x70\x74\x73']=0x0;[a0_0x544454(0xa8)]=0x0;[a0_0x544454(0xa4)]=0x0;[a0_0x544454(0x128)]=0x0;[a0_0x544454(0x104)]=0x0;[a0_0x544454(0x131)]=null;[a0_0x544454(0xc6)]=null;[a0_0x544454(0xb8)]=null;['\x70\x65\x6e\x64\x69\x6e\x67\x43\x61\x6c\x6c\x62\x61\x63\x6b\x73']=new Map();[a0_0x544454(0x137)]=0x0;[a0_0x544454(0x109)]=new Set();[a0_0x544454(0xf5)]=[];['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73']={...INITIAL_METRICS};[a0_0x544454(0x15b)]=null;[a0_0x544454(0x179)]=null;[a0_0x544454(0xe2)]=null;['\x69\x73\x52\x65\x70\x6c\x61\x79\x69\x6e\x67']=![];[a0_0x544454(0xa3)]={'\x74\x6f\x74\x61\x6c':0x0,'\x72\x65\x63\x65\x69\x76\x65\x64':0x0};constructor(_0x1feb6a){const _0x93efc=a0_0x544454,_0x4a0540={'\x4f\x52\x4b\x4d\x58':_0x93efc(0xa0),'\x62\x4d\x6a\x6f\x61':'\x5f\x5f\x74\x65\x73\x74\x5f\x5f'};let _0x5a700d;if(_0x1feb6a[_0x93efc(0x9c)])_0x5a700d=_0x1feb6a[_0x93efc(0x9c)];else{if(typeof globalThis!==_0x93efc(0x102)&&_0x4a0540[_0x93efc(0x121)]in globalThis)try{const _0x481354=_0x4a0540[_0x93efc(0x99)];localStorage[_0x93efc(0x105)](_0x481354,_0x481354),localStorage[_0x93efc(0xf7)](_0x481354),_0x5a700d=localStorage;}catch{_0x5a700d=new MemoryStorage();}else _0x5a700d=new MemoryStorage();}this[_0x93efc(0x11c)]={'\x75\x72\x6c':_0x1feb6a[_0x93efc(0xe4)],'\x73\x65\x73\x73\x69\x6f\x6e\x49\x64':_0x1feb6a[_0x93efc(0x141)],'\x74\x6f\x6b\x65\x6e':_0x1feb6a['\x74\x6f\x6b\x65\x6e'],'\x6f\x6e\x54\x6f\x6b\x65\x6e\x52\x65\x66\x72\x65\x73\x68':_0x1feb6a[_0x93efc(0x13c)],'\x74\x72\x61\x6e\x73\x70\x6f\x72\x74':_0x1feb6a['\x74\x72\x61\x6e\x73\x70\x6f\x72\x74']??DEFAULT_CONFIG['\x74\x72\x61\x6e\x73\x70\x6f\x72\x74'],'\x63\x68\x61\x6e\x6e\x65\x6c\x73':_0x1feb6a[_0x93efc(0xdd)]??DEFAULT_CONFIG[_0x93efc(0xdd)],'\x61\x75\x74\x6f\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74':_0x1feb6a['\x61\x75\x74\x6f\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74']??DEFAULT_CONFIG[_0x93efc(0x12b)],'\x6d\x61\x78\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74\x74\x65\x6d\x70\x74\x73':_0x1feb6a[_0x93efc(0xd3)]??DEFAULT_CONFIG[_0x93efc(0xd3)],'\x69\x6e\x69\x74\x69\x61\x6c\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x44\x65\x6c\x61\x79\x4d\x73':_0x1feb6a['\x69\x6e\x69\x74\x69\x61\x6c\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x44\x65\x6c\x61\x79\x4d\x73']??DEFAULT_CONFIG[_0x93efc(0x111)],'\x6d\x61\x78\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x44\x65\x6c\x61\x79\x4d\x73':_0x1feb6a[_0x93efc(0xf9)]??DEFAULT_CONFIG[_0x93efc(0xf9)],'\x70\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c\x4d\x73':_0x1feb6a[_0x93efc(0xdb)]??DEFAULT_CONFIG['\x70\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c\x4d\x73'],'\x70\x6f\x6e\x67\x54\x69\x6d\x65\x6f\x75\x74\x4d\x73':_0x1feb6a[_0x93efc(0x112)]??DEFAULT_CONFIG[_0x93efc(0x112)],'\x6d\x61\x78\x4d\x69\x73\x73\x65\x64\x50\x6f\x6e\x67\x73':_0x1feb6a[_0x93efc(0x14c)]??DEFAULT_CONFIG[_0x93efc(0x14c)],'\x65\x6e\x61\x62\x6c\x65\x44\x65\x64\x75\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e':_0x1feb6a[_0x93efc(0xf6)]??DEFAULT_CONFIG['\x65\x6e\x61\x62\x6c\x65\x44\x65\x64\x75\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e'],'\x6d\x61\x78\x44\x65\x64\x75\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x53\x69\x7a\x65':_0x1feb6a[_0x93efc(0x135)]??DEFAULT_CONFIG[_0x93efc(0x135)],'\x65\x6e\x61\x62\x6c\x65\x52\x65\x70\x6c\x61\x79\x50\x65\x72\x73\x69\x73\x74\x65\x6e\x63\x65':_0x1feb6a['\x65\x6e\x61\x62\x6c\x65\x52\x65\x70\x6c\x61\x79\x50\x65\x72\x73\x69\x73\x74\x65\x6e\x63\x65']??DEFAULT_CONFIG[_0x93efc(0xf4)],'\x72\x65\x70\x6c\x61\x79\x53\x74\x6f\x72\x61\x67\x65':_0x5a700d,'\x72\x65\x70\x6c\x61\x79\x53\x74\x6f\x72\x61\x67\x65\x4b\x65\x79\x50\x72\x65\x66\x69\x78':_0x1feb6a[_0x93efc(0x129)]??DEFAULT_CONFIG[_0x93efc(0x129)],'\x6c\x61\x74\x65\x6e\x63\x79\x48\x69\x73\x74\x6f\x72\x79\x53\x69\x7a\x65':_0x1feb6a['\x6c\x61\x74\x65\x6e\x63\x79\x48\x69\x73\x74\x6f\x72\x79\x53\x69\x7a\x65']??DEFAULT_CONFIG[_0x93efc(0x16a)]},this[_0x93efc(0x168)]=_0x1feb6a['\x68\x61\x6e\x64\x6c\x65\x72\x73']??{},this[_0x93efc(0xbd)]=_0x1feb6a[_0x93efc(0x154)];if(this[_0x93efc(0x11c)][_0x93efc(0xf4)])this[_0x93efc(0xfc)]();}[a0_0x544454(0xbb)](){const _0x319b95=a0_0x544454,_0x58696e={'\x48\x49\x44\x50\x62':_0x319b95(0xe3)};if(this[_0x319b95(0x120)]===_0x319b95(0x13f)||this[_0x319b95(0x120)]===_0x58696e[_0x319b95(0x97)])return;const _0xafe0ff=this[_0x319b95(0x15f)];this[_0x319b95(0x143)](_0xafe0ff?_0x319b95(0xaf):'\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6e\x67'),this[_0x319b95(0x15a)]();}[a0_0x544454(0x15a)](){const _0x15ec8f=a0_0x544454,_0x400995={'\x61\x4e\x47\x67\x53':'\x74\x6f\x6b\x65\x6e'},_0x1a89ba=new URL(this['\x63\x6f\x6e\x66\x69\x67'][_0x15ec8f(0xe4)]);_0x1a89ba['\x73\x65\x61\x72\x63\x68\x50\x61\x72\x61\x6d\x73'][_0x15ec8f(0x159)](_0x400995[_0x15ec8f(0x164)],this[_0x15ec8f(0xbd)]),this['\x77\x73']=new WebSocket(_0x1a89ba[_0x15ec8f(0x13b)]()),this['\x77\x73'][_0x15ec8f(0x94)]=()=>this[_0x15ec8f(0xd0)](),this['\x77\x73']['\x6f\x6e\x63\x6c\x6f\x73\x65']=_0x276256=>this[_0x15ec8f(0xf1)](_0x276256['\x63\x6f\x64\x65'],_0x276256[_0x15ec8f(0xbf)]),this['\x77\x73'][_0x15ec8f(0x107)]=_0x47144f=>{},this['\x77\x73'][_0x15ec8f(0x17e)]=_0x1d44bf=>this[_0x15ec8f(0xa9)](_0x1d44bf[_0x15ec8f(0xed)]);}['\x64\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74'](){const _0x34b23f=a0_0x544454,_0x428421={'\x6d\x47\x42\x62\x46':_0x34b23f(0xa1),'\x4a\x74\x63\x56\x69':'\x64\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64'};this[_0x34b23f(0xfb)](),this['\x77\x73']&&(this['\x77\x73'][_0x34b23f(0x16f)](0x3e8,_0x428421[_0x34b23f(0xc1)]),this['\x77\x73']=null),this[_0x34b23f(0x143)](_0x428421['\x4a\x74\x63\x56\x69']);}async[a0_0x544454(0x93)](_0x5188d3){const _0x3ac274=a0_0x544454,_0x5dc0f0={'\x76\x43\x78\x65\x49':_0x3ac274(0x93)};return(await this[_0x3ac274(0x92)]({'\x74\x79\x70\x65':_0x5dc0f0[_0x3ac274(0x113)],'\x63\x68\x61\x6e\x6e\x65\x6c\x73':_0x5188d3}))[_0x3ac274(0xdd)];}async['\x75\x6e\x73\x75\x62\x73\x63\x72\x69\x62\x65'](_0xac5dfd){const _0x3fb31b=a0_0x544454;return(await this[_0x3fb31b(0x92)]({'\x74\x79\x70\x65':_0x3fb31b(0x95),'\x63\x68\x61\x6e\x6e\x65\x6c\x73':_0xac5dfd}))[_0x3fb31b(0xdd)];}async[a0_0x544454(0x126)](){const _0x312eda=a0_0x544454,_0x8475d9={'\x56\x76\x64\x59\x42':_0x312eda(0x126)},_0xfbde54=Date[_0x312eda(0xe6)]();return await this[_0x312eda(0x92)]({'\x74\x79\x70\x65':_0x8475d9[_0x312eda(0x132)]}),Date[_0x312eda(0xe6)]()-_0xfbde54;}['\x72\x65\x70\x6c\x61\x79'](_0x547a96){const _0x10ada4=a0_0x544454;this[_0x10ada4(0x180)]({'\x74\x79\x70\x65':_0x10ada4(0x10b),'\x73\x69\x6e\x63\x65':_0x547a96});}[a0_0x544454(0x155)](_0x2a3224,_0x44ab43){const _0x4d60e1=a0_0x544454;if(!this[_0x4d60e1(0xc4)]())return![];return this[_0x4d60e1(0x180)]({'\x74\x79\x70\x65':_0x4d60e1(0x175),'\x64\x61\x74\x61':{'\x74\x65\x72\x6d\x69\x6e\x61\x6c\x49\x64':_0x2a3224,'\x69\x6e\x70\x75\x74':_0x44ab43}}),!![];}['\x73\x65\x74\x53\x65\x73\x73\x69\x6f\x6e\x43\x6f\x6e\x74\x65\x78\x74'](_0x55a2bb,_0x258be4){const _0xe20e00=a0_0x544454;this[_0xe20e00(0xe2)]=_0x55a2bb;if(_0x258be4)this[_0xe20e00(0x179)]=_0x258be4;this[_0xe20e00(0x138)]();}[a0_0x544454(0xb4)](){const _0x417d64=a0_0x544454,_0x4358da={'\x46\x6a\x43\x4c\x41':function(_0x521e2c,_0x2cb258){return _0x521e2c+_0x2cb258;}};this['\x6c\x61\x73\x74\x45\x76\x65\x6e\x74\x49\x64']=null,this[_0x417d64(0x179)]=null,this[_0x417d64(0xe2)]=null,this[_0x417d64(0x9f)]=![],this[_0x417d64(0xa3)]={'\x74\x6f\x74\x61\x6c':0x0,'\x72\x65\x63\x65\x69\x76\x65\x64':0x0},this[_0x417d64(0x109)]['\x63\x6c\x65\x61\x72'](),this[_0x417d64(0x104)]=0x0;if(this[_0x417d64(0x11c)][_0x417d64(0xf4)]){const _0x247414=this[_0x417d64(0x11c)][_0x417d64(0x129)];try{this[_0x417d64(0x11c)][_0x417d64(0x9c)][_0x417d64(0xf7)](_0x4358da['\x46\x6a\x43\x4c\x41'](_0x247414,STORAGE_KEYS['\x6c\x61\x73\x74\x45\x76\x65\x6e\x74\x49\x64'])),this[_0x417d64(0x11c)]['\x72\x65\x70\x6c\x61\x79\x53\x74\x6f\x72\x61\x67\x65']['\x72\x65\x6d\x6f\x76\x65\x49\x74\x65\x6d'](_0x247414+STORAGE_KEYS[_0x417d64(0x162)]),this[_0x417d64(0x11c)][_0x417d64(0x9c)]['\x72\x65\x6d\x6f\x76\x65\x49\x74\x65\x6d'](_0x247414+STORAGE_KEYS['\x73\x65\x73\x73\x69\x6f\x6e\x49\x64']);}catch{}}}[a0_0x544454(0x10d)](){const _0x353ac9=a0_0x544454;return{'\x69\x73\x52\x65\x70\x6c\x61\x79\x69\x6e\x67':this[_0x353ac9(0x9f)],'\x70\x72\x6f\x67\x72\x65\x73\x73':{...this[_0x353ac9(0xa3)]}};}['\x67\x65\x74\x53\x74\x61\x74\x73'](){const _0x209f74=a0_0x544454;return{'\x73\x74\x61\x74\x65':this[_0x209f74(0x120)],'\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x41\x74':this['\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x41\x74'],'\x6c\x61\x73\x74\x50\x69\x6e\x67\x41\x74':this[_0x209f74(0x166)],'\x6c\x61\x73\x74\x50\x6f\x6e\x67\x41\x74':this[_0x209f74(0x149)],'\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74\x74\x65\x6d\x70\x74\x73':this['\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74\x74\x65\x6d\x70\x74\x73'],'\x6d\x65\x73\x73\x61\x67\x65\x73\x52\x65\x63\x65\x69\x76\x65\x64':this[_0x209f74(0xa8)],'\x6d\x65\x73\x73\x61\x67\x65\x73\x53\x65\x6e\x74':this[_0x209f74(0xa4)],'\x65\x76\x65\x6e\x74\x73\x52\x65\x63\x65\x69\x76\x65\x64':this[_0x209f74(0x128)],'\x64\x75\x70\x6c\x69\x63\x61\x74\x65\x73\x53\x6b\x69\x70\x70\x65\x64':this[_0x209f74(0x104)],'\x6d\x65\x74\x72\x69\x63\x73':{...this['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73']},'\x72\x65\x70\x6c\x61\x79':this['\x67\x65\x74\x52\x65\x70\x6c\x61\x79\x53\x74\x61\x74\x65']()};}[a0_0x544454(0x16d)](){const _0xb7806e=a0_0x544454;return this[_0xb7806e(0x120)];}[a0_0x544454(0xc4)](){const _0x44bc0f=a0_0x544454,_0x3ee108={'\x55\x55\x55\x79\x77':function(_0x41ebda,_0x18270e){return _0x41ebda===_0x18270e;}};return _0x3ee108[_0x44bc0f(0xe7)](this[_0x44bc0f(0x120)],_0x44bc0f(0x13f));}[a0_0x544454(0x153)](){const _0x2460cb=a0_0x544454;return this[_0x2460cb(0x17a)][_0x2460cb(0xd2)];}[a0_0x544454(0x178)](){return{...this['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73']};}[a0_0x544454(0x101)](){const _0x34e84f=a0_0x544454;this[_0x34e84f(0xf5)]=[],this['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73']={...INITIAL_METRICS},this[_0x34e84f(0x168)][_0x34e84f(0x96)]?.(this[_0x34e84f(0x17a)]);}['\x75\x70\x64\x61\x74\x65\x54\x6f\x6b\x65\x6e'](_0x259b0c){const _0x461341=a0_0x544454,_0x103290={'\x65\x66\x50\x59\x55':'\x54\x6f\x6b\x65\x6e\x20\x72\x65\x66\x72\x65\x73\x68\x65\x64'};this[_0x461341(0xbd)]=_0x259b0c;if(this[_0x461341(0x120)]===_0x461341(0x13f)&&this['\x77\x73'])this['\x77\x73'][_0x461341(0x16f)](0x3e8,_0x103290['\x65\x66\x50\x59\x55']);}[a0_0x544454(0x140)](){const _0x52f10f=a0_0x544454;return this[_0x52f10f(0xbd)];}[a0_0x544454(0x143)](_0x5707f6){const _0x58e1f7=a0_0x544454,_0x3a2938={'\x52\x50\x75\x72\x69':function(_0x27f27a,_0x58b98d){return _0x27f27a!==_0x58b98d;}};_0x3a2938[_0x58e1f7(0xdf)](this['\x73\x74\x61\x74\x65'],_0x5707f6)&&(this['\x73\x74\x61\x74\x65']=_0x5707f6,this[_0x58e1f7(0x118)](),this[_0x58e1f7(0x168)][_0x58e1f7(0xe5)]?.(_0x5707f6));}['\x68\x61\x6e\x64\x6c\x65\x4f\x70\x65\x6e'](){const _0x53f376=a0_0x544454,_0xd28223=this[_0x53f376(0x15f)];this[_0x53f376(0x15f)]=!![],this[_0x53f376(0x143)]('\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64'),this[_0x53f376(0x171)]=Date['\x6e\x6f\x77'](),this[_0x53f376(0xd6)]=0x0,this['\x6d\x69\x73\x73\x65\x64\x50\x6f\x6e\x67\x43\x6f\x75\x6e\x74']=0x0,this[_0x53f376(0x133)](),this[_0x53f376(0x9b)](),_0xd28223&&(this[_0x53f376(0xcd)](),this[_0x53f376(0x168)][_0x53f376(0x11b)]?.());}[a0_0x544454(0xf1)](_0x529481,_0x2b58ce){const _0x53f0fa=a0_0x544454,_0x4df5f2={'\x70\x52\x41\x4c\x6e':function(_0x43d6b5,_0x3a6037){return _0x43d6b5<_0x3a6037;}};this[_0x53f0fa(0xfb)](),this[_0x53f0fa(0x168)][_0x53f0fa(0x14b)]?.(_0x529481,_0x2b58ce);if(this[_0x53f0fa(0x11c)][_0x53f0fa(0x12b)]&&_0x4df5f2[_0x53f0fa(0xf2)](this['\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74\x74\x65\x6d\x70\x74\x73'],this['\x63\x6f\x6e\x66\x69\x67'][_0x53f0fa(0xd3)]))this[_0x53f0fa(0x98)]();else this[_0x53f0fa(0x143)](_0x53f0fa(0x114));}[a0_0x544454(0xa9)](_0x17565f){const _0x2dff36=a0_0x544454,_0xb84374={'\x4f\x70\x65\x67\x47':function(_0x5a58c1,_0x48ed42){return _0x5a58c1!==_0x48ed42;},'\x4c\x67\x61\x74\x77':_0x2dff36(0xc7),'\x6b\x72\x41\x64\x64':function(_0x52b491,_0x47e93c){return _0x52b491===_0x47e93c;},'\x6a\x43\x6c\x4f\x79':function(_0x1ca6ec,_0x59319e){return _0x1ca6ec in _0x59319e;},'\x63\x4b\x76\x6c\x6a':function(_0x7530a0,_0x4b30df){return _0x7530a0>_0x4b30df;},'\x54\x56\x55\x67\x6c':function(_0x3d633c,_0x4d1df2){return _0x3d633c*_0x4d1df2;}};this[_0x2dff36(0xa8)]++;try{const _0x460aa1=JSON['\x70\x61\x72\x73\x65'](_0x17565f);if(!_0x460aa1[_0x2dff36(0x122)]&&_0x460aa1[_0x2dff36(0x11d)])_0x460aa1[_0x2dff36(0x122)]=_0x460aa1['\x6d\x65\x73\x73\x61\x67\x65\x54\x79\x70\x65'];if(typeof _0x460aa1[_0x2dff36(0x122)]===_0x2dff36(0x17b)&&_0xb84374[_0x2dff36(0x10c)](WIRE_TYPE_MAP[_0x460aa1[_0x2dff36(0x122)]],void 0x0))_0x460aa1['\x74\x79\x70\x65']=WIRE_TYPE_MAP[_0x460aa1[_0x2dff36(0x122)]];if(_0x460aa1[_0x2dff36(0xed)]&&typeof _0x460aa1[_0x2dff36(0xed)]===_0xb84374[_0x2dff36(0x17f)]){const _0x3df264=_0x460aa1[_0x2dff36(0xed)];if(_0x3df264['\x73\x69\x64\x65\x63\x61\x72\x49\x64']!==void 0x0&&_0xb84374[_0x2dff36(0xab)](_0x3df264[_0x2dff36(0x145)],void 0x0))_0x3df264[_0x2dff36(0x145)]=_0x3df264[_0x2dff36(0x16c)];}if(_0x460aa1['\x74\x79\x70\x65']===_0x2dff36(0xd8)&&!_0x460aa1[_0x2dff36(0xed)]&&_0x460aa1['\x63\x68\x61\x6e\x6e\x65\x6c']){const {type:_0x3bb88a,messageType:_0x5a4fe6,channel:_0x32cb13,id:_0x57208e,sequenceId:_0x5b32e2,timestamp:_0x13fbef,..._0x3e385e}=_0x460aa1;_0x460aa1[_0x2dff36(0xed)]=_0x3e385e;}if(_0x460aa1[_0x2dff36(0x122)]===_0x2dff36(0x17c)){this[_0x2dff36(0x124)](_0x460aa1[_0x2dff36(0x14e)]);return;}if(_0xb84374[_0x2dff36(0x174)]('\x69\x64',_0x460aa1)&&_0x460aa1['\x69\x64']&&this['\x63\x6f\x6e\x66\x69\x67'][_0x2dff36(0xf6)]){const _0x4a01a6=_0x460aa1['\x69\x64'];if(this[_0x2dff36(0x109)][_0x2dff36(0x172)](_0x4a01a6)){this['\x64\x75\x70\x6c\x69\x63\x61\x74\x65\x73\x53\x6b\x69\x70\x70\x65\x64']++;return;}this[_0x2dff36(0x109)][_0x2dff36(0xb7)](_0x4a01a6);if(_0xb84374[_0x2dff36(0xda)](this[_0x2dff36(0x109)][_0x2dff36(0x11e)],this[_0x2dff36(0x11c)][_0x2dff36(0x135)])){const _0x2f2732=Math[_0x2dff36(0xd1)](_0xb84374[_0x2dff36(0x125)](this[_0x2dff36(0x11c)][_0x2dff36(0x135)],0.1));let _0x4f6311=0x0;for(const _0x24c93e of this['\x70\x72\x6f\x63\x65\x73\x73\x65\x64\x45\x76\x65\x6e\x74\x49\x64\x73']){if(_0x4f6311>=_0x2f2732)break;this[_0x2dff36(0x109)][_0x2dff36(0xea)](_0x24c93e),_0x4f6311++;}}this[_0x2dff36(0x15b)]=_0x4a01a6,this[_0x2dff36(0x138)]();}this[_0x2dff36(0x151)](_0x460aa1);}catch{}}[a0_0x544454(0x124)](_0x37f647){const _0x3170ff=a0_0x544454,_0x2c2891={'\x41\x6c\x55\x57\x44':function(_0x34e117,_0x4df4b7){return _0x34e117>_0x4df4b7;}},_0x4f2b38=Date[_0x3170ff(0xe6)]();this[_0x3170ff(0x149)]=_0x37f647,this[_0x3170ff(0xf3)]=0x0,this[_0x3170ff(0x14a)]();if(this['\x6c\x61\x73\x74\x50\x69\x6e\x67\x53\x65\x6e\x74\x41\x74']){const _0x9a4c58=_0x4f2b38-this[_0x3170ff(0x9d)];this[_0x3170ff(0xf5)][_0x3170ff(0x12e)](_0x9a4c58);if(_0x2c2891[_0x3170ff(0xef)](this[_0x3170ff(0xf5)]['\x6c\x65\x6e\x67\x74\x68'],this[_0x3170ff(0x11c)]['\x6c\x61\x74\x65\x6e\x63\x79\x48\x69\x73\x74\x6f\x72\x79\x53\x69\x7a\x65']))this[_0x3170ff(0xf5)]['\x73\x68\x69\x66\x74']();this[_0x3170ff(0xc3)](_0x9a4c58,_0x4f2b38);}}[a0_0x544454(0x151)](_0x448cd6){const _0x3ebf30=a0_0x544454,_0x124678={'\x73\x54\x77\x47\x50':_0x3ebf30(0x136),'\x61\x69\x67\x50\x50':function(_0x3d8aec,_0x4e47a9){return _0x3d8aec in _0x4e47a9;},'\x41\x4a\x4b\x48\x64':_0x3ebf30(0xed),'\x58\x78\x4d\x76\x67':_0x3ebf30(0xec),'\x73\x6f\x64\x74\x52':'\x72\x75\x6e\x74\x69\x6d\x65\x2e\x64\x69\x73\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64','\x55\x51\x58\x65\x67':'\x69\x6e\x76\x61\x6c\x69\x64\x5f\x70\x61\x79\x6c\x6f\x61\x64','\x4f\x6b\x69\x4b\x64':'\x70\x6f\x72\x74\x2e\x63\x6c\x6f\x73\x65\x64','\x51\x77\x51\x4c\x76':_0x3ebf30(0xb5),'\x5a\x67\x51\x7a\x69':_0x3ebf30(0xce),'\x57\x53\x50\x77\x52':_0x3ebf30(0xd9),'\x61\x71\x44\x6b\x74':'\x74\x6f\x6b\x65\x6e\x2e\x65\x78\x70\x69\x72\x65\x64','\x6c\x4e\x6b\x44\x69':_0x3ebf30(0x108)};if('\x69\x64'in _0x448cd6&&_0x448cd6['\x69\x64']){const _0x1d52b1=this[_0x3ebf30(0xb2)][_0x3ebf30(0x123)](_0x448cd6['\x69\x64']);if(_0x1d52b1){this['\x70\x65\x6e\x64\x69\x6e\x67\x43\x61\x6c\x6c\x62\x61\x63\x6b\x73'][_0x3ebf30(0xea)](_0x448cd6['\x69\x64']);if(_0x448cd6[_0x3ebf30(0x122)]===_0x124678['\x73\x54\x77\x47\x50'])_0x1d52b1[_0x3ebf30(0xde)](new Error(_0x448cd6['\x6d\x65\x73\x73\x61\x67\x65']));else _0x1d52b1[_0x3ebf30(0x15c)](_0x124678[_0x3ebf30(0x183)](_0x124678[_0x3ebf30(0xba)],_0x448cd6)?_0x448cd6[_0x3ebf30(0xed)]:void 0x0);return;}}switch(_0x448cd6[_0x3ebf30(0x122)]){case'\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x2e\x65\x73\x74\x61\x62\x6c\x69\x73\x68\x65\x64':this['\x68\x61\x6e\x64\x6c\x65\x72\x73'][_0x3ebf30(0xf8)]?.(_0x448cd6['\x64\x61\x74\x61'][_0x3ebf30(0x141)]);break;case _0x124678[_0x3ebf30(0x134)]:this[_0x3ebf30(0x168)][_0x3ebf30(0xca)]?.(_0x448cd6['\x64\x61\x74\x61'][_0x3ebf30(0x145)],_0x448cd6['\x64\x61\x74\x61'][_0x3ebf30(0x177)]);break;case _0x124678[_0x3ebf30(0x130)]:this[_0x3ebf30(0x168)][_0x3ebf30(0x14f)]?.(_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0x145)],_0x448cd6['\x64\x61\x74\x61']['\x65\x72\x72\x6f\x72']);break;case _0x3ebf30(0x127):this[_0x3ebf30(0x168)][_0x3ebf30(0x115)]?.(_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0x141)],_0x448cd6['\x64\x61\x74\x61']['\x63\x6f\x6e\x74\x61\x69\x6e\x65\x72\x49\x64'],_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0xbf)]);break;case _0x3ebf30(0xbc):{const _0x2bf9bc=_0x448cd6[_0x3ebf30(0xed)],_0x12b6a9=_0x2bf9bc[_0x3ebf30(0x145)]??_0x2bf9bc[_0x3ebf30(0x16c)];if(_0x12b6a9)this[_0x3ebf30(0x168)][_0x3ebf30(0xfa)]?.(_0x12b6a9);else this[_0x3ebf30(0x168)][_0x3ebf30(0x119)]?.(_0x3ebf30(0xcf),_0x124678[_0x3ebf30(0xd7)]);break;}case _0x3ebf30(0x185):this[_0x3ebf30(0x168)][_0x3ebf30(0xe1)]?.(_0x448cd6[_0x3ebf30(0xed)]);break;case'\x70\x6f\x72\x74\x2e\x6f\x70\x65\x6e\x65\x64':this[_0x3ebf30(0x168)][_0x3ebf30(0xeb)]?.(_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0xaa)],_0x448cd6['\x64\x61\x74\x61'][_0x3ebf30(0xe9)],_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0x163)]);break;case _0x124678['\x4f\x6b\x69\x4b\x64']:this[_0x3ebf30(0x168)][_0x3ebf30(0x157)]?.(_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0xaa)]);break;case _0x3ebf30(0xd8):this[_0x3ebf30(0x128)]++,this[_0x3ebf30(0x156)](_0x448cd6[_0x3ebf30(0xed)]),this[_0x3ebf30(0x168)][_0x3ebf30(0x144)]?.(_0x448cd6[_0x3ebf30(0x150)],_0x448cd6['\x64\x61\x74\x61'],_0x448cd6[_0x3ebf30(0x116)]);break;case _0x3ebf30(0x182):this['\x69\x73\x52\x65\x70\x6c\x61\x79\x69\x6e\x67']=!![],this[_0x3ebf30(0xa3)]={'\x74\x6f\x74\x61\x6c':_0x448cd6[_0x3ebf30(0x169)],'\x72\x65\x63\x65\x69\x76\x65\x64':0x0},this[_0x3ebf30(0x168)][_0x3ebf30(0x10e)]?.(_0x448cd6[_0x3ebf30(0x169)]);break;case _0x124678[_0x3ebf30(0x146)]:this[_0x3ebf30(0xa3)][_0x3ebf30(0xb1)]=_0x448cd6[_0x3ebf30(0xb1)],this[_0x3ebf30(0x168)][_0x3ebf30(0x13e)]?.(_0x448cd6['\x72\x65\x63\x65\x69\x76\x65\x64'],this[_0x3ebf30(0xa3)]['\x74\x6f\x74\x61\x6c']);break;case _0x124678[_0x3ebf30(0xdc)]:this[_0x3ebf30(0x9f)]=![],this[_0x3ebf30(0x168)][_0x3ebf30(0x13d)]?.(_0x448cd6[_0x3ebf30(0x169)]);break;case _0x3ebf30(0x136):this['\x68\x61\x6e\x64\x6c\x65\x72\x73'][_0x3ebf30(0x119)]?.(_0x448cd6[_0x3ebf30(0x10f)],_0x448cd6[_0x3ebf30(0x117)]);break;case _0x124678['\x57\x53\x50\x77\x52']:this[_0x3ebf30(0x168)]['\x6f\x6e\x54\x6f\x6b\x65\x6e\x45\x78\x70\x69\x72\x69\x6e\x67']?.(_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0xf0)]),this[_0x3ebf30(0x11f)]();break;case _0x124678[_0x3ebf30(0x103)]:this[_0x3ebf30(0x168)]['\x6f\x6e\x54\x6f\x6b\x65\x6e\x45\x78\x70\x69\x72\x65\x64']?.();break;case _0x124678[_0x3ebf30(0xee)]:this[_0x3ebf30(0x168)]['\x6f\x6e\x42\x61\x63\x6b\x70\x72\x65\x73\x73\x75\x72\x65\x57\x61\x72\x6e\x69\x6e\x67']?.(_0x448cd6['\x64\x61\x74\x61']['\x64\x72\x6f\x70\x70\x65\x64\x43\x6f\x75\x6e\x74'],_0x448cd6['\x64\x61\x74\x61']['\x73\x69\x6e\x63\x65'],_0x448cd6[_0x3ebf30(0xed)][_0x3ebf30(0x12c)]);break;}}[a0_0x544454(0x156)](_0x46b4e7){const _0x5371a3=a0_0x544454,_0x588133={'\x6c\x62\x71\x47\x6b':'\x6f\x62\x6a\x65\x63\x74'};if(typeof _0x46b4e7!==_0x588133[_0x5371a3(0x161)]||_0x46b4e7===null)return;const _0x3e558d=_0x46b4e7;_0x3e558d[_0x5371a3(0x162)]&&(this[_0x5371a3(0x179)]=_0x3e558d[_0x5371a3(0x162)],this[_0x5371a3(0x138)]()),_0x3e558d['\x74\x79\x70\x65']===_0x5371a3(0x147)&&_0x3e558d[_0x5371a3(0x141)]&&(this[_0x5371a3(0xe2)]=_0x3e558d[_0x5371a3(0x141)],this[_0x5371a3(0x138)]());}async[a0_0x544454(0x11f)](){const _0x10f1ea=a0_0x544454,_0x33b17e={'\x42\x77\x44\x4b\x46':'\x54\x4f\x4b\x45\x4e\x5f\x52\x45\x46\x52\x45\x53\x48\x5f\x46\x41\x49\x4c\x45\x44'};if(!this[_0x10f1ea(0x11c)][_0x10f1ea(0x13c)]||this['\x69\x73\x52\x65\x66\x72\x65\x73\x68\x69\x6e\x67\x54\x6f\x6b\x65\x6e'])return;this['\x69\x73\x52\x65\x66\x72\x65\x73\x68\x69\x6e\x67\x54\x6f\x6b\x65\x6e']=!![];try{const _0x19d79f=await this['\x63\x6f\x6e\x66\x69\x67'][_0x10f1ea(0x13c)]();this[_0x10f1ea(0x13a)](_0x19d79f[_0x10f1ea(0x154)]);}catch(_0x202fba){this[_0x10f1ea(0x168)][_0x10f1ea(0x119)]?.(_0x10f1ea(0xa2)+(_0x202fba instanceof Error?_0x202fba['\x6d\x65\x73\x73\x61\x67\x65']:String(_0x202fba)),_0x33b17e[_0x10f1ea(0xb6)]);}finally{this[_0x10f1ea(0x12a)]=![];}}[a0_0x544454(0x180)](_0x39af98){const _0xd352c=a0_0x544454;this['\x77\x73']?.['\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65']===WebSocket[_0xd352c(0x12f)]&&(this['\x77\x73'][_0xd352c(0x180)](JSON[_0xd352c(0x165)](_0x39af98)),this['\x6d\x65\x73\x73\x61\x67\x65\x73\x53\x65\x6e\x74']++);}['\x73\x65\x6e\x64\x57\x69\x74\x68\x52\x65\x73\x70\x6f\x6e\x73\x65'](_0x20d54e){const _0x34fe75=a0_0x544454,_0x5864da={'\x67\x48\x76\x71\x66':function(_0x1dc924,_0x214eff){return _0x1dc924(_0x214eff);},'\x65\x52\x78\x74\x49':_0x34fe75(0xd5),'\x6e\x6a\x54\x52\x59':function(_0x12afe0,_0x33f838,_0x550855){return _0x12afe0(_0x33f838,_0x550855);}};return new Promise((_0x27f057,_0x4a21f4)=>{const _0x5241f4=_0x34fe75,_0x121a3f=_0x5241f4(0xa6)+ ++this[_0x5241f4(0x137)];this['\x70\x65\x6e\x64\x69\x6e\x67\x43\x61\x6c\x6c\x62\x61\x63\x6b\x73'][_0x5241f4(0x159)](_0x121a3f,{'\x72\x65\x73\x6f\x6c\x76\x65':_0x27f057,'\x72\x65\x6a\x65\x63\x74':_0x4a21f4}),_0x5864da['\x6e\x6a\x54\x52\x59'](setTimeout,()=>{const _0xb150ed=_0x5241f4;this['\x70\x65\x6e\x64\x69\x6e\x67\x43\x61\x6c\x6c\x62\x61\x63\x6b\x73'][_0xb150ed(0x172)](_0x121a3f)&&(this[_0xb150ed(0xb2)][_0xb150ed(0xea)](_0x121a3f),_0x5864da[_0xb150ed(0x170)](_0x4a21f4,new Error(_0x5864da[_0xb150ed(0x152)])));},0x2710),this[_0x5241f4(0x180)]({..._0x20d54e,'\x69\x64':_0x121a3f});});}[a0_0x544454(0x9b)](){const _0x4f7fd7=a0_0x544454,_0x1f89b2={'\x70\x70\x6f\x67\x46':function(_0x42b4b6,_0x31157f){return _0x42b4b6>_0x31157f;}},_0x1ad87c=this[_0x4f7fd7(0x11c)][_0x4f7fd7(0xdd)],_0x1d45ae={};if(this[_0x4f7fd7(0x15b)])_0x1d45ae[_0x4f7fd7(0x15b)]=this[_0x4f7fd7(0x15b)];if(this[_0x4f7fd7(0x179)])_0x1d45ae[_0x4f7fd7(0x162)]=this['\x63\x75\x72\x72\x65\x6e\x74\x45\x78\x65\x63\x75\x74\x69\x6f\x6e\x49\x64'];if(this[_0x4f7fd7(0xe2)])_0x1d45ae[_0x4f7fd7(0x141)]=this[_0x4f7fd7(0xe2)];const _0x78743a=_0x1f89b2[_0x4f7fd7(0xbe)](Object[_0x4f7fd7(0xa5)](_0x1d45ae)[_0x4f7fd7(0x184)],0x0);_0x78743a&&(this[_0x4f7fd7(0x9f)]=!![],this[_0x4f7fd7(0xa3)]={'\x74\x6f\x74\x61\x6c':0x0,'\x72\x65\x63\x65\x69\x76\x65\x64':0x0}),this['\x73\x65\x6e\x64']({'\x74\x79\x70\x65':_0x4f7fd7(0x93),'\x63\x68\x61\x6e\x6e\x65\x6c\x73':_0x1ad87c,..._0x78743a?{'\x72\x65\x70\x6c\x61\x79\x4f\x70\x74\x69\x6f\x6e\x73':_0x1d45ae}:{}});}[a0_0x544454(0x133)](){const _0x2a3a26=a0_0x544454;this['\x73\x74\x6f\x70\x50\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c'](),this[_0x2a3a26(0xc6)]=setInterval(()=>{const _0x91484=_0x2a3a26;this[_0x91484(0xc8)]();},this[_0x2a3a26(0x11c)]['\x70\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c\x4d\x73']);}[a0_0x544454(0xfd)](){const _0x3f5045=a0_0x544454;this['\x70\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c']&&(clearInterval(this[_0x3f5045(0xc6)]),this['\x70\x69\x6e\x67\x49\x6e\x74\x65\x72\x76\x61\x6c']=null);}[a0_0x544454(0xc8)](){const _0x44688=a0_0x544454,_0x18a560={'\x74\x67\x63\x6c\x52':_0x44688(0x126),'\x51\x45\x55\x62\x66':function(_0x4761be,_0x4f5f95,_0x406e33){return _0x4761be(_0x4f5f95,_0x406e33);}};if(this['\x77\x73']?.['\x72\x65\x61\x64\x79\x53\x74\x61\x74\x65']!==WebSocket[_0x44688(0x12f)])return;const _0x5c16f0=this[_0x44688(0x149)]?Date[_0x44688(0xe6)]()-this[_0x44688(0x149)]:0x0;if(this['\x6c\x61\x73\x74\x50\x6f\x6e\x67\x41\x74']&&_0x5c16f0>this[_0x44688(0x11c)][_0x44688(0x112)]){this[_0x44688(0xf3)]++,this[_0x44688(0x118)]();if(this[_0x44688(0xf3)]>=this[_0x44688(0x11c)]['\x6d\x61\x78\x4d\x69\x73\x73\x65\x64\x50\x6f\x6e\x67\x73']){this['\x77\x73']?.[_0x44688(0x16f)](0xfa0,_0x44688(0x10a));return;}}this[_0x44688(0x166)]=Date[_0x44688(0xe6)](),this[_0x44688(0x9d)]=Date[_0x44688(0xe6)](),this[_0x44688(0x180)]({'\x74\x79\x70\x65':_0x18a560[_0x44688(0x11a)]}),this['\x70\x6f\x6e\x67\x54\x69\x6d\x65\x6f\x75\x74']=_0x18a560[_0x44688(0x160)](setTimeout,()=>{const _0x29c5ea=_0x44688;this[_0x29c5ea(0xf3)]++,this['\x75\x70\x64\x61\x74\x65\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x51\x75\x61\x6c\x69\x74\x79']();},this[_0x44688(0x11c)][_0x44688(0x112)]);}[a0_0x544454(0x14a)](){const _0x4fe442=a0_0x544454;this[_0x4fe442(0xb8)]&&(clearTimeout(this[_0x4fe442(0xb8)]),this[_0x4fe442(0xb8)]=null);}['\x73\x63\x68\x65\x64\x75\x6c\x65\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74'](){const _0x2600f1=a0_0x544454,_0x51797f={'\x43\x66\x58\x6e\x43':function(_0x1535b3,_0xc683d6){return _0x1535b3**_0xc683d6;},'\x45\x66\x6c\x73\x56':function(_0x1a088c,_0x3954b2){return _0x1a088c+_0x3954b2;}};if(this[_0x2600f1(0x131)])return;this[_0x2600f1(0xd6)]++;const _0x1456a3=Math[_0x2600f1(0x100)](this[_0x2600f1(0x11c)]['\x69\x6e\x69\x74\x69\x61\x6c\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x44\x65\x6c\x61\x79\x4d\x73']*_0x51797f[_0x2600f1(0x9e)](0x2,this[_0x2600f1(0xd6)]-0x1),this[_0x2600f1(0x11c)][_0x2600f1(0xf9)]),_0x11eb36=_0x1456a3*0.3*(Math[_0x2600f1(0x12d)]()*0x2-0x1);this[_0x2600f1(0x131)]=setTimeout(()=>{const _0x3ef453=_0x2600f1;this['\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x54\x69\x6d\x65\x72']=null,this[_0x3ef453(0xbb)]();},_0x51797f[_0x2600f1(0x14d)](_0x1456a3,_0x11eb36));}[a0_0x544454(0xfb)](){const _0x364748=a0_0x544454,_0x443071={'\x47\x59\x55\x43\x51':_0x364748(0x176)};this[_0x364748(0xfd)](),this['\x63\x6c\x65\x61\x72\x50\x6f\x6e\x67\x54\x69\x6d\x65\x6f\x75\x74']();this[_0x364748(0x131)]&&(clearTimeout(this['\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x54\x69\x6d\x65\x72']),this[_0x364748(0x131)]=null);for(const [_0x12fca3,_0x2eb88b]of this[_0x364748(0xb2)]){_0x2eb88b[_0x364748(0xde)](new Error(_0x443071[_0x364748(0xcb)])),this[_0x364748(0xb2)][_0x364748(0xea)](_0x12fca3);}}[a0_0x544454(0xc3)](_0x4401a2,_0x4fca3d){const _0x46af5a=a0_0x544454,_0x293ee9={'\x6f\x79\x46\x64\x67':function(_0x4cc0cd,_0x216ca1){return _0x4cc0cd>_0x216ca1;}},_0x3f532f=_0x293ee9[_0x46af5a(0xd4)](this[_0x46af5a(0xf5)][_0x46af5a(0x184)],0x0)?this[_0x46af5a(0xf5)]['\x72\x65\x64\x75\x63\x65']((_0x2d6273,_0x415a01)=>_0x2d6273+_0x415a01,0x0)/this['\x70\x69\x6e\x67\x4c\x61\x74\x65\x6e\x63\x79\x48\x69\x73\x74\x6f\x72\x79'][_0x46af5a(0x184)]:null;this['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73']={...this[_0x46af5a(0x17a)],'\x6c\x61\x73\x74\x50\x69\x6e\x67\x4c\x61\x74\x65\x6e\x63\x79\x4d\x73':_0x4401a2,'\x61\x76\x67\x50\x69\x6e\x67\x4c\x61\x74\x65\x6e\x63\x79\x4d\x73':_0x3f532f,'\x6d\x69\x73\x73\x65\x64\x50\x6f\x6e\x67\x43\x6f\x75\x6e\x74':this[_0x46af5a(0xf3)],'\x6c\x61\x73\x74\x50\x6f\x6e\x67\x41\x74':_0x4fca3d},this[_0x46af5a(0x118)]();}['\x75\x70\x64\x61\x74\x65\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x51\x75\x61\x6c\x69\x74\x79'](){const _0x163abe=a0_0x544454,_0x377371={'\x78\x4f\x4e\x79\x69':function(_0xf0b1aa,_0x340526){return _0xf0b1aa===_0x340526;}},_0x552ac5=_0x377371[_0x163abe(0xa7)](this[_0x163abe(0x120)],'\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64'),_0x41f146=calculateConnectionQuality(this[_0x163abe(0x17a)],_0x552ac5);this['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73'][_0x163abe(0xd2)]!==_0x41f146&&(this[_0x163abe(0x17a)]={...this[_0x163abe(0x17a)],'\x71\x75\x61\x6c\x69\x74\x79':_0x41f146},this['\x68\x61\x6e\x64\x6c\x65\x72\x73']['\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73\x43\x68\x61\x6e\x67\x65']?.(this[_0x163abe(0x17a)]));}[a0_0x544454(0xcd)](){const _0x29628e=a0_0x544454,_0x2f362f={'\x5a\x55\x6d\x7a\x5a':function(_0x458b94,_0x23ed93){return _0x458b94+_0x23ed93;}},_0x2d33a4=Date[_0x29628e(0xe6)]();this[_0x29628e(0x17a)]={...this[_0x29628e(0x17a)],'\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x43\x6f\x75\x6e\x74':_0x2f362f[_0x29628e(0xc9)](this['\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x4d\x65\x74\x72\x69\x63\x73']['\x72\x65\x63\x6f\x6e\x6e\x65\x63\x74\x43\x6f\x75\x6e\x74'],0x1),'\x6c\x61\x73\x74\x52\x65\x63\x6f\x6e\x6e\x65\x63\x74\x41\x74':_0x2d33a4},this[_0x29628e(0xf5)]=[],this[_0x29628e(0x118)]();}['\x6c\x6f\x61\x64\x52\x65\x70\x6c\x61\x79\x53\x74\x61\x74\x65'](){const _0x2af509=a0_0x544454,_0x4a1e72={'\x59\x57\x4c\x64\x54':function(_0x2ddec7,_0x2c9034){return _0x2ddec7+_0x2c9034;}};if(!this[_0x2af509(0x11c)][_0x2af509(0xf4)])return;const _0x25d0b2=this[_0x2af509(0x11c)][_0x2af509(0x129)];try{this[_0x2af509(0x15b)]=this[_0x2af509(0x11c)]['\x72\x65\x70\x6c\x61\x79\x53\x74\x6f\x72\x61\x67\x65'][_0x2af509(0x106)](_0x4a1e72[_0x2af509(0x167)](_0x25d0b2,STORAGE_KEYS['\x6c\x61\x73\x74\x45\x76\x65\x6e\x74\x49\x64'])),this[_0x2af509(0x179)]=this[_0x2af509(0x11c)][_0x2af509(0x9c)][_0x2af509(0x106)](_0x4a1e72['\x59\x57\x4c\x64\x54'](_0x25d0b2,STORAGE_KEYS[_0x2af509(0x162)])),this[_0x2af509(0xe2)]=this[_0x2af509(0x11c)][_0x2af509(0x9c)][_0x2af509(0x106)](_0x4a1e72[_0x2af509(0x167)](_0x25d0b2,STORAGE_KEYS[_0x2af509(0x141)]));}catch{}}[a0_0x544454(0x138)](){const _0x3c8282=a0_0x544454,_0x5e994b={'\x51\x6e\x62\x47\x72':function(_0x25d83f,_0x8c12de){return _0x25d83f+_0x8c12de;},'\x63\x54\x49\x53\x74':function(_0x238cd5,_0x1c1e99){return _0x238cd5+_0x1c1e99;}};if(!this[_0x3c8282(0x11c)][_0x3c8282(0xf4)])return;const _0xf9d3f9=this[_0x3c8282(0x11c)][_0x3c8282(0x129)];try{if(this['\x6c\x61\x73\x74\x45\x76\x65\x6e\x74\x49\x64'])this[_0x3c8282(0x11c)][_0x3c8282(0x9c)]['\x73\x65\x74\x49\x74\x65\x6d'](_0x5e994b[_0x3c8282(0xff)](_0xf9d3f9,STORAGE_KEYS['\x6c\x61\x73\x74\x45\x76\x65\x6e\x74\x49\x64']),this[_0x3c8282(0x15b)]);if(this[_0x3c8282(0x179)])this[_0x3c8282(0x11c)][_0x3c8282(0x9c)][_0x3c8282(0x105)](_0x5e994b[_0x3c8282(0xc2)](_0xf9d3f9,STORAGE_KEYS[_0x3c8282(0x162)]),this[_0x3c8282(0x179)]);if(this['\x63\x75\x72\x72\x65\x6e\x74\x53\x65\x73\x73\x69\x6f\x6e\x49\x64'])this['\x63\x6f\x6e\x66\x69\x67'][_0x3c8282(0x9c)][_0x3c8282(0x105)](_0x5e994b[_0x3c8282(0xc2)](_0xf9d3f9,STORAGE_KEYS[_0x3c8282(0x141)]),this['\x63\x75\x72\x72\x65\x6e\x74\x53\x65\x73\x73\x69\x6f\x6e\x49\x64']);}catch{}}};function a0_0x5ae1(){const _0x2963bd=['\x42\x32\x35\x6e\x7a\x78\x72\x59\x41\x77\x6e\x5a\x71\x32\x48\x48\x42\x4d\x44\x4c','\x73\x65\x4c\x65\x75\x67\x69','\x43\x32\x6e\x4f\x7a\x77\x72\x31\x42\x67\x76\x73\x7a\x77\x6e\x56\x42\x4d\x35\x4c\x79\x33\x71','\x79\x4b\x31\x51\x42\x32\x65','\x77\x4c\x44\x32\x7a\x65\x53','\x43\x4d\x76\x5a\x44\x67\x39\x59\x7a\x76\x6e\x31\x79\x4e\x6e\x4a\x43\x4d\x4c\x57\x44\x67\x4c\x56\x42\x4e\x6d','\x43\x4d\x76\x57\x42\x67\x66\x35\x75\x33\x72\x56\x43\x4d\x66\x4e\x7a\x71','\x42\x67\x66\x5a\x44\x66\x62\x50\x42\x4d\x44\x74\x7a\x77\x35\x30\x71\x78\x71','\x71\x32\x7a\x79\x42\x4b\x6d','\x41\x78\x6e\x73\x7a\x78\x62\x53\x79\x78\x4c\x50\x42\x4d\x43','\x42\x67\x39\x4a\x79\x77\x58\x74\x44\x67\x39\x59\x79\x77\x44\x4c','\x71\x32\x58\x50\x7a\x77\x35\x30\x69\x67\x72\x50\x43\x32\x6e\x56\x42\x4d\x35\x4c\x79\x33\x71','\x76\x67\x39\x52\x7a\x77\x34\x47\x43\x4d\x76\x4d\x43\x4d\x76\x5a\x41\x63\x62\x4d\x79\x77\x4c\x53\x7a\x77\x71\x36\x69\x61','\x43\x4d\x76\x57\x42\x67\x66\x35\x75\x68\x6a\x56\x7a\x33\x6a\x4c\x43\x33\x6d','\x42\x77\x76\x5a\x43\x32\x66\x4e\x7a\x78\x6e\x74\x7a\x77\x35\x30','\x41\x32\x76\x35\x43\x57','\x42\x78\x6e\x4e\x78\x57','\x45\x65\x39\x6f\x45\x77\x4b','\x42\x77\x76\x5a\x43\x32\x66\x4e\x7a\x78\x6e\x73\x7a\x77\x6e\x4c\x41\x78\x7a\x4c\x7a\x61','\x41\x67\x66\x55\x7a\x67\x58\x4c\x74\x77\x76\x5a\x43\x32\x66\x4e\x7a\x71','\x43\x67\x39\x59\x44\x61','\x41\x33\x6a\x62\x7a\x67\x71','\x7a\x78\x48\x4a\x7a\x77\x58\x53\x7a\x77\x35\x30','\x72\x78\x66\x79\x75\x78\x47','\x75\x78\x6a\x70\x41\x77\x38','\x43\x4d\x76\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x41\x77\x35\x4e','\x74\x66\x50\x76\x76\x67\x47','\x43\x4d\x76\x4a\x7a\x77\x4c\x32\x7a\x77\x71','\x43\x67\x76\x55\x7a\x67\x4c\x55\x7a\x30\x6e\x48\x42\x67\x58\x49\x79\x77\x6e\x52\x43\x57','\x7a\x32\x39\x56\x7a\x61','\x79\x32\x58\x4c\x79\x78\x6a\x73\x7a\x78\x62\x53\x79\x78\x4c\x74\x44\x67\x66\x30\x7a\x71','\x43\x4d\x76\x57\x42\x67\x66\x35\x6c\x4e\x62\x59\x42\x32\x44\x59\x7a\x78\x6e\x5a','\x71\x4e\x44\x65\x73\x30\x79','\x79\x77\x72\x4b','\x43\x67\x39\x55\x7a\x31\x72\x50\x42\x77\x76\x56\x44\x78\x71','\x6e\x74\x43\x32\x6d\x74\x69\x33\x74\x68\x62\x35\x75\x65\x54\x4b','\x71\x75\x50\x6c\x73\x67\x71','\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x61','\x79\x32\x39\x55\x44\x67\x66\x50\x42\x4d\x76\x59\x6c\x4e\x6a\x4c\x79\x77\x72\x35','\x79\x33\x76\x59\x43\x4d\x76\x55\x44\x66\x72\x56\x41\x32\x76\x55','\x43\x68\x62\x56\x7a\x30\x79','\x43\x4d\x76\x48\x43\x32\x39\x55','\x43\x4e\x76\x55\x44\x67\x4c\x54\x7a\x73\x35\x4b\x41\x78\x6e\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x7a\x77\x71','\x42\x75\x44\x63\x79\x4b\x79','\x79\x31\x72\x6a\x75\x33\x71','\x44\x78\x62\x4b\x79\x78\x72\x4c\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x4b\x31\x4c\x44\x68\x6a\x50\x79\x33\x6d','\x41\x78\x6e\x64\x42\x32\x35\x55\x7a\x77\x6e\x30\x7a\x77\x71','\x6f\x64\x69\x31\x6e\x5a\x6a\x4a\x45\x77\x39\x6e\x45\x76\x47','\x43\x67\x4c\x55\x7a\x30\x4c\x55\x44\x67\x76\x59\x44\x4d\x66\x53','\x42\x32\x6a\x51\x7a\x77\x6e\x30','\x43\x32\x76\x55\x7a\x66\x62\x50\x42\x4d\x43','\x77\x4c\x76\x54\x45\x4c\x4f','\x42\x32\x35\x73\x44\x77\x35\x30\x41\x77\x31\x4c\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x76\x4b','\x72\x31\x4c\x76\x71\x31\x65','\x76\x4b\x58\x63\x43\x78\x71','\x44\x68\x6a\x48\x79\x32\x54\x73\x7a\x77\x6e\x56\x42\x4d\x35\x4c\x79\x33\x72\x50\x42\x32\x34','\x43\x4d\x76\x57\x42\x67\x66\x35\x6c\x4d\x6e\x56\x42\x78\x62\x53\x7a\x78\x72\x4c','\x79\x32\x39\x55\x44\x67\x66\x50\x42\x4d\x76\x59\x6c\x4e\x6a\x4c\x79\x77\x72\x35\x69\x67\x76\x32\x7a\x77\x35\x30\x69\x68\x6a\x4c\x79\x32\x76\x50\x44\x4d\x76\x4b\x69\x68\x44\x50\x44\x67\x48\x56\x44\x78\x71\x47\x43\x32\x66\x55\x7a\x67\x6a\x56\x45\x65\x4c\x4b','\x41\x67\x66\x55\x7a\x67\x58\x4c\x74\x33\x62\x4c\x42\x47','\x7a\x4d\x58\x56\x42\x33\x69','\x43\x78\x76\x48\x42\x67\x4c\x30\x45\x71','\x42\x77\x66\x34\x75\x4d\x76\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x71\x78\x72\x30\x7a\x77\x31\x57\x44\x68\x6d','\x42\x33\x4c\x67\x7a\x67\x43','\x75\x4d\x76\x58\x44\x77\x76\x5a\x44\x63\x62\x30\x41\x77\x31\x4c\x42\x33\x76\x30','\x43\x4d\x76\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x71\x78\x72\x30\x7a\x77\x31\x57\x44\x68\x6d','\x76\x76\x66\x79\x7a\x77\x43','\x79\x77\x44\x4c\x42\x4e\x71\x55\x7a\x78\x7a\x4c\x42\x4e\x71','\x44\x67\x39\x52\x7a\x77\x34\x55\x7a\x78\x48\x57\x41\x78\x6a\x50\x42\x4d\x43','\x79\x30\x54\x32\x42\x67\x4f','\x43\x67\x4c\x55\x7a\x30\x4c\x55\x44\x67\x76\x59\x44\x4d\x66\x53\x74\x78\x6d','\x77\x4d\x44\x72\x45\x4d\x4b','\x79\x32\x48\x48\x42\x4d\x35\x4c\x42\x68\x6d','\x43\x4d\x76\x51\x7a\x77\x6e\x30','\x75\x4c\x62\x31\x43\x4d\x4b','\x6f\x77\x72\x7a\x73\x32\x76\x36\x41\x47','\x42\x32\x35\x73\x44\x77\x35\x30\x41\x77\x31\x4c\x75\x4d\x76\x48\x7a\x68\x4b','\x79\x33\x76\x59\x43\x4d\x76\x55\x44\x66\x6e\x4c\x43\x33\x6e\x50\x42\x32\x35\x6a\x7a\x61','\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x55\x7a\x57','\x44\x78\x6a\x53','\x42\x32\x35\x74\x44\x67\x66\x30\x7a\x75\x6e\x4f\x79\x77\x35\x4e\x7a\x71','\x42\x4d\x39\x33','\x76\x76\x76\x76\x45\x78\x43','\x6e\x74\x4b\x59\x6d\x4a\x75\x59\x7a\x66\x6a\x74\x77\x68\x4c\x75','\x43\x68\x6a\x56\x44\x67\x39\x4a\x42\x32\x57','\x7a\x67\x76\x53\x7a\x78\x72\x4c','\x42\x32\x35\x71\x42\x33\x6a\x30\x74\x33\x62\x4c\x42\x4d\x76\x4b','\x43\x4e\x76\x55\x44\x67\x4c\x54\x7a\x73\x35\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x7a\x77\x71','\x7a\x67\x66\x30\x79\x71','\x42\x65\x35\x52\x72\x67\x4b','\x71\x77\x58\x76\x76\x30\x71','\x43\x32\x76\x4a\x42\x32\x35\x4b\x43\x31\x6a\x4c\x42\x77\x66\x50\x42\x4d\x4c\x55\x7a\x57','\x41\x67\x66\x55\x7a\x67\x58\x4c\x71\x32\x58\x56\x43\x32\x75','\x43\x66\x6a\x62\x74\x67\x34','\x42\x77\x4c\x5a\x43\x32\x76\x4b\x75\x67\x39\x55\x7a\x30\x6e\x56\x44\x77\x35\x30','\x7a\x77\x35\x48\x79\x4d\x58\x4c\x75\x4d\x76\x57\x42\x67\x66\x35\x75\x67\x76\x59\x43\x32\x4c\x5a\x44\x67\x76\x55\x79\x32\x75','\x43\x67\x4c\x55\x7a\x30\x58\x48\x44\x67\x76\x55\x79\x33\x4c\x69\x41\x78\x6e\x30\x42\x33\x6a\x35','\x7a\x77\x35\x48\x79\x4d\x58\x4c\x72\x67\x76\x4b\x44\x78\x62\x53\x41\x77\x6e\x48\x44\x67\x4c\x56\x42\x47','\x43\x4d\x76\x54\x42\x33\x7a\x4c\x73\x78\x72\x4c\x42\x71','\x42\x32\x35\x64\x42\x32\x35\x55\x7a\x77\x6e\x30','\x42\x77\x66\x34\x75\x4d\x76\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x72\x67\x76\x53\x79\x78\x4c\x6e\x43\x57','\x42\x32\x35\x64\x42\x32\x35\x30\x79\x77\x4c\x55\x7a\x78\x6a\x73\x7a\x77\x66\x4b\x45\x71','\x79\x32\x58\x4c\x79\x77\x35\x31\x43\x61','\x42\x67\x39\x48\x7a\x66\x6a\x4c\x43\x67\x58\x48\x45\x76\x6e\x30\x79\x78\x72\x4c','\x43\x33\x72\x56\x43\x66\x62\x50\x42\x4d\x44\x6a\x42\x4e\x72\x4c\x43\x4e\x7a\x48\x42\x61','\x71\x76\x72\x41\x43\x77\x57','\x75\x77\x35\x49\x72\x33\x69','\x42\x77\x4c\x55','\x43\x4d\x76\x5a\x7a\x78\x72\x6e\x7a\x78\x72\x59\x41\x77\x6e\x5a','\x44\x77\x35\x4b\x7a\x77\x7a\x50\x42\x4d\x76\x4b','\x79\x78\x66\x65\x41\x33\x71','\x7a\x68\x76\x57\x42\x67\x4c\x4a\x79\x78\x72\x4c\x43\x31\x6e\x52\x41\x78\x62\x57\x7a\x77\x71','\x43\x32\x76\x30\x73\x78\x72\x4c\x42\x71','\x7a\x32\x76\x30\x73\x78\x72\x4c\x42\x71','\x42\x32\x35\x4c\x43\x4e\x6a\x56\x43\x47','\x79\x4d\x66\x4a\x41\x33\x62\x59\x7a\x78\x6e\x5a\x44\x78\x6a\x4c\x6c\x4e\x44\x48\x43\x4d\x35\x50\x42\x4d\x43','\x43\x68\x6a\x56\x79\x32\x76\x5a\x43\x32\x76\x4b\x72\x78\x7a\x4c\x42\x4e\x72\x6a\x7a\x68\x6d','\x75\x67\x39\x55\x7a\x59\x62\x30\x41\x77\x31\x4c\x42\x33\x76\x30\x69\x63\x30\x47\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x49\x62\x31\x42\x4e\x6a\x4c\x43\x33\x62\x56\x42\x4e\x6e\x50\x44\x4d\x75','\x43\x4d\x76\x57\x42\x67\x66\x35','\x74\x33\x62\x4c\x7a\x30\x43','\x7a\x32\x76\x30\x75\x4d\x76\x57\x42\x67\x66\x35\x75\x33\x72\x48\x44\x67\x75','\x42\x32\x35\x73\x7a\x78\x62\x53\x79\x78\x4c\x74\x44\x67\x66\x59\x44\x61','\x42\x77\x76\x5a\x43\x32\x66\x4e\x7a\x71','\x6d\x74\x6d\x34\x76\x67\x39\x55\x44\x66\x48\x69','\x41\x77\x35\x50\x44\x67\x4c\x48\x42\x66\x6a\x4c\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x65\x72\x4c\x42\x67\x66\x35\x74\x78\x6d','\x43\x67\x39\x55\x7a\x31\x72\x50\x42\x77\x76\x56\x44\x78\x72\x6e\x43\x57','\x44\x4b\x6e\x34\x7a\x75\x4b','\x7a\x67\x4c\x5a\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x76\x4b','\x42\x32\x35\x73\x44\x77\x35\x30\x41\x77\x31\x4c\x74\x4d\x39\x30\x72\x4d\x39\x31\x42\x4d\x71','\x43\x32\x76\x58\x44\x77\x76\x55\x79\x32\x76\x6a\x7a\x61','\x79\x32\x39\x4b\x7a\x71','\x44\x78\x62\x4b\x79\x78\x72\x4c\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x4c\x66\x31\x79\x77\x58\x50\x44\x68\x4b','\x42\x32\x35\x66\x43\x4e\x6a\x56\x43\x47','\x44\x67\x44\x4a\x42\x66\x69','\x42\x32\x35\x73\x7a\x77\x6e\x56\x42\x4d\x35\x4c\x79\x33\x71','\x79\x32\x39\x55\x7a\x4d\x4c\x4e','\x42\x77\x76\x5a\x43\x32\x66\x4e\x7a\x76\x72\x35\x43\x67\x75','\x43\x32\x4c\x36\x7a\x71','\x41\x67\x66\x55\x7a\x67\x58\x4c\x76\x67\x39\x52\x7a\x77\x35\x66\x45\x68\x62\x50\x43\x4d\x4c\x55\x7a\x57','\x43\x33\x72\x48\x44\x67\x75','\x74\x31\x6a\x6c\x74\x76\x47','\x44\x68\x4c\x57\x7a\x71','\x7a\x32\x76\x30','\x41\x67\x66\x55\x7a\x67\x58\x4c\x75\x67\x39\x55\x7a\x57','\x76\x66\x7a\x76\x7a\x32\x57','\x43\x67\x4c\x55\x7a\x57','\x43\x4e\x76\x55\x44\x67\x4c\x54\x7a\x73\x35\x55\x42\x33\x72\x46\x7a\x4d\x39\x31\x42\x4d\x71','\x7a\x78\x7a\x4c\x42\x4e\x72\x5a\x75\x4d\x76\x4a\x7a\x77\x4c\x32\x7a\x77\x71','\x43\x4d\x76\x57\x42\x67\x66\x35\x75\x33\x72\x56\x43\x4d\x66\x4e\x7a\x75\x54\x4c\x45\x76\x62\x59\x7a\x77\x7a\x50\x45\x61','\x41\x78\x6e\x73\x7a\x77\x7a\x59\x7a\x78\x6e\x4f\x41\x77\x35\x4e\x76\x67\x39\x52\x7a\x77\x34','\x79\x78\x76\x30\x42\x31\x6a\x4c\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x61','\x44\x67\x39\x30\x79\x77\x58\x65\x43\x4d\x39\x57\x43\x67\x76\x4b','\x43\x4d\x66\x55\x7a\x67\x39\x54','\x43\x68\x76\x5a\x41\x61','\x74\x31\x62\x66\x74\x47','\x43\x32\x39\x4b\x44\x66\x69','\x43\x4d\x76\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30\x76\x67\x4c\x54\x7a\x78\x69','\x76\x4e\x7a\x4b\x77\x75\x69','\x43\x33\x72\x48\x43\x4e\x72\x71\x41\x77\x35\x4e\x73\x77\x35\x30\x7a\x78\x6a\x32\x79\x77\x57','\x77\x68\x48\x6e\x44\x4d\x43','\x42\x77\x66\x34\x72\x67\x76\x4b\x44\x78\x62\x53\x41\x77\x6e\x48\x44\x67\x4c\x56\x42\x4c\x6e\x50\x45\x4d\x75','\x7a\x78\x6a\x59\x42\x33\x69','\x42\x77\x76\x5a\x43\x32\x66\x4e\x7a\x75\x4c\x4b\x71\x32\x39\x31\x42\x4e\x72\x4c\x43\x47','\x43\x32\x66\x32\x7a\x76\x6a\x4c\x43\x67\x58\x48\x45\x76\x6e\x30\x79\x78\x72\x4c','\x7a\x78\x48\x4c\x79\x33\x76\x30\x41\x77\x39\x55\x78\x32\x4c\x4b','\x44\x78\x62\x4b\x79\x78\x72\x4c\x76\x67\x39\x52\x7a\x77\x34','\x44\x67\x39\x74\x44\x68\x6a\x50\x42\x4d\x43','\x42\x32\x35\x75\x42\x32\x54\x4c\x42\x4c\x6a\x4c\x7a\x4e\x6a\x4c\x43\x32\x47','\x42\x32\x35\x73\x7a\x78\x62\x53\x79\x78\x4c\x64\x42\x32\x31\x57\x42\x67\x76\x30\x7a\x71','\x42\x32\x35\x73\x7a\x78\x62\x53\x79\x78\x4c\x71\x43\x4d\x39\x4e\x43\x4d\x76\x5a\x43\x57','\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x76\x4b','\x7a\x32\x76\x30\x76\x67\x39\x52\x7a\x77\x34','\x43\x32\x76\x5a\x43\x32\x4c\x56\x42\x4b\x4c\x4b','\x6e\x74\x43\x5a\x6d\x74\x43\x57\x72\x76\x48\x48\x7a\x4e\x66\x32','\x43\x32\x76\x30\x75\x33\x72\x48\x44\x67\x75','\x42\x32\x35\x62\x7a\x32\x76\x55\x44\x65\x76\x32\x7a\x77\x35\x30','\x43\x32\x66\x55\x7a\x67\x6a\x56\x45\x65\x4c\x4b','\x75\x78\x44\x72\x74\x68\x79','\x7a\x78\x48\x4c\x79\x33\x76\x30\x41\x77\x39\x55\x6c\x4e\x6e\x30\x79\x78\x6a\x30\x7a\x77\x71','\x44\x67\x35\x6c\x76\x4c\x79','\x42\x67\x66\x5a\x44\x66\x62\x56\x42\x4d\x44\x62\x44\x61','\x79\x32\x58\x4c\x79\x78\x6a\x71\x42\x32\x35\x4e\x76\x67\x4c\x54\x7a\x77\x39\x31\x44\x61','\x42\x32\x35\x65\x41\x78\x6e\x4a\x42\x32\x35\x55\x7a\x77\x6e\x30','\x42\x77\x66\x34\x74\x77\x4c\x5a\x43\x32\x76\x4b\x75\x67\x39\x55\x7a\x33\x6d','\x72\x77\x7a\x53\x43\x31\x79','\x44\x67\x4c\x54\x7a\x78\x6e\x30\x79\x77\x31\x57','\x42\x32\x35\x73\x44\x77\x35\x30\x41\x77\x31\x4c\x72\x67\x4c\x5a\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x76\x4b','\x79\x32\x48\x48\x42\x4d\x35\x4c\x42\x61','\x7a\x67\x4c\x5a\x43\x67\x66\x30\x79\x32\x48\x6e\x7a\x78\x6e\x5a\x79\x77\x44\x4c','\x7a\x76\x6a\x34\x44\x65\x4b','\x7a\x32\x76\x30\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x4c\x66\x31\x79\x77\x58\x50\x44\x68\x4b','\x44\x67\x39\x52\x7a\x77\x34','\x43\x32\x76\x55\x7a\x66\x72\x4c\x43\x4d\x31\x50\x42\x4d\x66\x53\x73\x77\x35\x57\x44\x78\x71','\x44\x68\x6a\x48\x79\x32\x54\x66\x45\x67\x76\x4a\x44\x78\x72\x50\x42\x32\x35\x64\x42\x32\x35\x30\x7a\x78\x48\x30','\x42\x32\x35\x71\x42\x33\x6a\x30\x71\x32\x58\x56\x43\x32\x76\x4b','\x43\x33\x72\x56\x43\x4d\x75','\x43\x32\x76\x30','\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x66\x44\x4c\x79\x4c\x6e\x56\x79\x32\x54\x4c\x44\x61','\x42\x67\x66\x5a\x44\x65\x76\x32\x7a\x77\x35\x30\x73\x77\x71','\x43\x4d\x76\x5a\x42\x32\x58\x32\x7a\x71','\x44\x32\x76\x49\x43\x32\x39\x4a\x41\x32\x76\x30','\x6d\x4a\x75\x59\x6f\x74\x6a\x34\x71\x77\x39\x41\x45\x4d\x53','\x41\x67\x66\x5a\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x76\x4b\x71\x4d\x76\x4d\x42\x33\x6a\x4c','\x75\x75\x76\x76\x79\x4d\x79','\x42\x67\x6a\x58\x72\x32\x53','\x7a\x78\x48\x4c\x79\x33\x76\x30\x41\x77\x39\x55\x73\x77\x71','\x43\x68\x6a\x56\x79\x32\x76\x5a\x43\x30\x35\x48\x42\x77\x75','\x79\x75\x35\x68\x7a\x31\x6d','\x43\x33\x72\x59\x41\x77\x35\x4e\x41\x77\x7a\x35','\x42\x67\x66\x5a\x44\x66\x62\x50\x42\x4d\x44\x62\x44\x61','\x77\x76\x44\x6d\x7a\x66\x71','\x41\x67\x66\x55\x7a\x67\x58\x4c\x43\x4e\x6d','\x44\x67\x39\x30\x79\x77\x57','\x42\x67\x66\x30\x7a\x77\x35\x4a\x45\x75\x48\x50\x43\x33\x72\x56\x43\x4e\x4c\x74\x41\x78\x50\x4c','\x6e\x4a\x47\x57\x42\x78\x7a\x66\x75\x76\x44\x30','\x43\x32\x4c\x4b\x7a\x77\x6e\x48\x43\x4b\x4c\x4b','\x7a\x32\x76\x30\x75\x33\x72\x48\x44\x67\x75','\x6e\x74\x65\x31\x6d\x5a\x4b\x58\x6e\x4c\x76\x72\x75\x30\x66\x5a\x71\x71','\x79\x32\x58\x56\x43\x32\x75','\x7a\x30\x48\x32\x43\x77\x79','\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x76\x4b\x71\x78\x71','\x41\x67\x66\x5a','\x6d\x74\x71\x33\x6d\x74\x69\x30\x6e\x74\x7a\x77\x79\x4b\x72\x34\x43\x66\x47','\x41\x4b\x6e\x53\x74\x33\x4b','\x44\x67\x76\x59\x42\x77\x4c\x55\x79\x77\x57\x55\x41\x77\x35\x57\x44\x78\x71','\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x49\x62\x4a\x42\x67\x39\x5a\x7a\x77\x71','\x79\x4d\x66\x5a\x7a\x76\x76\x59\x42\x61','\x7a\x32\x76\x30\x71\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x4b\x31\x4c\x44\x68\x6a\x50\x79\x33\x6d','\x79\x33\x76\x59\x43\x4d\x76\x55\x44\x65\x76\x34\x7a\x77\x6e\x31\x44\x67\x4c\x56\x42\x4b\x4c\x4b','\x79\x32\x39\x55\x42\x4d\x76\x4a\x44\x67\x4c\x56\x42\x4b\x31\x4c\x44\x68\x6a\x50\x79\x33\x6d','\x43\x33\x72\x59\x41\x77\x35\x4e','\x43\x67\x39\x55\x7a\x57','\x43\x32\x76\x5a\x43\x32\x4c\x56\x42\x4c\x39\x4e\x79\x78\x72\x4c\x44\x32\x66\x35\x78\x57','\x42\x32\x35\x54\x7a\x78\x6e\x5a\x79\x77\x44\x4c','\x74\x67\x44\x48\x44\x68\x43','\x43\x32\x76\x55\x7a\x61','\x6d\x74\x76\x5a\x71\x30\x58\x51\x79\x4b\x65','\x43\x4d\x76\x57\x42\x67\x66\x35\x6c\x4e\x6e\x30\x79\x78\x6a\x30','\x79\x77\x4c\x4e\x75\x66\x61','\x42\x67\x76\x55\x7a\x33\x72\x4f','\x43\x4e\x76\x55\x44\x67\x4c\x54\x7a\x73\x35\x59\x7a\x77\x66\x4b\x45\x71','\x42\x67\x66\x5a\x44\x66\x39\x4c\x44\x4d\x76\x55\x44\x66\x39\x50\x7a\x61','\x43\x32\x76\x55\x7a\x66\x44\x50\x44\x67\x48\x73\x7a\x78\x6e\x57\x42\x32\x35\x5a\x7a\x71','\x43\x33\x76\x49\x43\x32\x6e\x59\x41\x77\x6a\x4c','\x42\x32\x35\x56\x43\x67\x76\x55','\x44\x77\x35\x5a\x44\x77\x6a\x5a\x79\x33\x6a\x50\x79\x4d\x75'];a0_0x5ae1=function(){return _0x2963bd;};return a0_0x5ae1();}export{INITIAL_METRICS,SessionGatewayClient,calculateConnectionQuality};
|
|
1
|
+
//#region src/session-gateway/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* Default connection metrics.
|
|
4
|
+
*/
|
|
5
|
+
const INITIAL_METRICS = {
|
|
6
|
+
lastPingLatencyMs: null,
|
|
7
|
+
avgPingLatencyMs: null,
|
|
8
|
+
missedPongCount: 0,
|
|
9
|
+
reconnectCount: 0,
|
|
10
|
+
lastPongAt: null,
|
|
11
|
+
lastReconnectAt: null,
|
|
12
|
+
quality: "disconnected"
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Calculate connection quality from metrics.
|
|
16
|
+
*/
|
|
17
|
+
function calculateConnectionQuality(metrics, isConnected) {
|
|
18
|
+
if (!isConnected) return "disconnected";
|
|
19
|
+
const { avgPingLatencyMs, missedPongCount, reconnectCount, lastReconnectAt } = metrics;
|
|
20
|
+
const recentReconnect = lastReconnectAt && Date.now() - lastReconnectAt < 300 * 1e3;
|
|
21
|
+
if (missedPongCount >= 2 || recentReconnect && reconnectCount > 1) return "poor";
|
|
22
|
+
if (missedPongCount >= 1 || avgPingLatencyMs !== null && avgPingLatencyMs > 1e3 || recentReconnect) return "degraded";
|
|
23
|
+
if (avgPingLatencyMs !== null && avgPingLatencyMs < 100 && reconnectCount === 0) return "excellent";
|
|
24
|
+
if (avgPingLatencyMs !== null && avgPingLatencyMs <= 300) return "good";
|
|
25
|
+
return "good";
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/session-gateway/client.ts
|
|
29
|
+
/**
|
|
30
|
+
* SessionGatewayClient
|
|
31
|
+
*
|
|
32
|
+
* WebSocket client for Sandbox API session streaming.
|
|
33
|
+
* Browser-safe: no Node.js APIs.
|
|
34
|
+
*/
|
|
35
|
+
const DEFAULT_CONFIG = {
|
|
36
|
+
transport: "websocket",
|
|
37
|
+
channels: ["*"],
|
|
38
|
+
autoReconnect: true,
|
|
39
|
+
maxReconnectAttempts: 10,
|
|
40
|
+
initialReconnectDelayMs: 1e3,
|
|
41
|
+
maxReconnectDelayMs: 3e4,
|
|
42
|
+
pingIntervalMs: 3e4,
|
|
43
|
+
pongTimeoutMs: 1e4,
|
|
44
|
+
maxMissedPongs: 2,
|
|
45
|
+
enableDeduplication: true,
|
|
46
|
+
maxDeduplicationSize: 1e3,
|
|
47
|
+
enableReplayPersistence: false,
|
|
48
|
+
replayStorageKeyPrefix: "session_gateway_",
|
|
49
|
+
latencyHistorySize: 10
|
|
50
|
+
};
|
|
51
|
+
const STORAGE_KEYS = {
|
|
52
|
+
lastEventId: "last_event_id",
|
|
53
|
+
executionId: "execution_id",
|
|
54
|
+
sessionId: "session_id"
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Legacy wire-protocol message type map. The current server emits the
|
|
58
|
+
* `sidecar.*` message types; the SDK surfaces the canonical `runtime.*`
|
|
59
|
+
* names. Kept at module scope so it isn't re-allocated per inbound
|
|
60
|
+
* WebSocket message.
|
|
61
|
+
*/
|
|
62
|
+
const WIRE_TYPE_MAP = {
|
|
63
|
+
"sidecar.connected": "runtime.connected",
|
|
64
|
+
"sidecar.disconnected": "runtime.disconnected",
|
|
65
|
+
"sidecar.not_found": "runtime.not_found",
|
|
66
|
+
"sidecar.ready": "runtime.ready"
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Memory-based storage fallback when localStorage is not available.
|
|
70
|
+
*/
|
|
71
|
+
var MemoryStorage = class {
|
|
72
|
+
store = /* @__PURE__ */ new Map();
|
|
73
|
+
getItem(key) {
|
|
74
|
+
return this.store.get(key) ?? null;
|
|
75
|
+
}
|
|
76
|
+
setItem(key, value) {
|
|
77
|
+
this.store.set(key, value);
|
|
78
|
+
}
|
|
79
|
+
removeItem(key) {
|
|
80
|
+
this.store.delete(key);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var SessionGatewayClient = class {
|
|
84
|
+
ws = null;
|
|
85
|
+
config;
|
|
86
|
+
handlers;
|
|
87
|
+
currentToken;
|
|
88
|
+
isRefreshingToken = false;
|
|
89
|
+
state = "disconnected";
|
|
90
|
+
connectedAt = null;
|
|
91
|
+
hasConnectedBefore = false;
|
|
92
|
+
lastPingAt = null;
|
|
93
|
+
lastPongAt = null;
|
|
94
|
+
lastPingSentAt = null;
|
|
95
|
+
missedPongCount = 0;
|
|
96
|
+
reconnectAttempts = 0;
|
|
97
|
+
messagesReceived = 0;
|
|
98
|
+
messagesSent = 0;
|
|
99
|
+
eventsReceived = 0;
|
|
100
|
+
duplicatesSkipped = 0;
|
|
101
|
+
reconnectTimer = null;
|
|
102
|
+
pingInterval = null;
|
|
103
|
+
pongTimeout = null;
|
|
104
|
+
pendingCallbacks = /* @__PURE__ */ new Map();
|
|
105
|
+
messageIdCounter = 0;
|
|
106
|
+
processedEventIds = /* @__PURE__ */ new Set();
|
|
107
|
+
pingLatencyHistory = [];
|
|
108
|
+
connectionMetrics = { ...INITIAL_METRICS };
|
|
109
|
+
lastEventId = null;
|
|
110
|
+
currentExecutionId = null;
|
|
111
|
+
currentSessionId = null;
|
|
112
|
+
isReplaying = false;
|
|
113
|
+
replayProgress = {
|
|
114
|
+
total: 0,
|
|
115
|
+
received: 0
|
|
116
|
+
};
|
|
117
|
+
constructor(config) {
|
|
118
|
+
let storage;
|
|
119
|
+
if (config.replayStorage) storage = config.replayStorage;
|
|
120
|
+
else if (typeof globalThis !== "undefined" && "localStorage" in globalThis) try {
|
|
121
|
+
const testKey = "__test__";
|
|
122
|
+
localStorage.setItem(testKey, testKey);
|
|
123
|
+
localStorage.removeItem(testKey);
|
|
124
|
+
storage = localStorage;
|
|
125
|
+
} catch {
|
|
126
|
+
storage = new MemoryStorage();
|
|
127
|
+
}
|
|
128
|
+
else storage = new MemoryStorage();
|
|
129
|
+
this.config = {
|
|
130
|
+
url: config.url,
|
|
131
|
+
sessionId: config.sessionId,
|
|
132
|
+
token: config.token,
|
|
133
|
+
onTokenRefresh: config.onTokenRefresh,
|
|
134
|
+
transport: config.transport ?? DEFAULT_CONFIG.transport,
|
|
135
|
+
channels: config.channels ?? DEFAULT_CONFIG.channels,
|
|
136
|
+
autoReconnect: config.autoReconnect ?? DEFAULT_CONFIG.autoReconnect,
|
|
137
|
+
maxReconnectAttempts: config.maxReconnectAttempts ?? DEFAULT_CONFIG.maxReconnectAttempts,
|
|
138
|
+
initialReconnectDelayMs: config.initialReconnectDelayMs ?? DEFAULT_CONFIG.initialReconnectDelayMs,
|
|
139
|
+
maxReconnectDelayMs: config.maxReconnectDelayMs ?? DEFAULT_CONFIG.maxReconnectDelayMs,
|
|
140
|
+
pingIntervalMs: config.pingIntervalMs ?? DEFAULT_CONFIG.pingIntervalMs,
|
|
141
|
+
pongTimeoutMs: config.pongTimeoutMs ?? DEFAULT_CONFIG.pongTimeoutMs,
|
|
142
|
+
maxMissedPongs: config.maxMissedPongs ?? DEFAULT_CONFIG.maxMissedPongs,
|
|
143
|
+
enableDeduplication: config.enableDeduplication ?? DEFAULT_CONFIG.enableDeduplication,
|
|
144
|
+
maxDeduplicationSize: config.maxDeduplicationSize ?? DEFAULT_CONFIG.maxDeduplicationSize,
|
|
145
|
+
enableReplayPersistence: config.enableReplayPersistence ?? DEFAULT_CONFIG.enableReplayPersistence,
|
|
146
|
+
replayStorage: storage,
|
|
147
|
+
replayStorageKeyPrefix: config.replayStorageKeyPrefix ?? DEFAULT_CONFIG.replayStorageKeyPrefix,
|
|
148
|
+
latencyHistorySize: config.latencyHistorySize ?? DEFAULT_CONFIG.latencyHistorySize
|
|
149
|
+
};
|
|
150
|
+
this.handlers = config.handlers ?? {};
|
|
151
|
+
this.currentToken = config.token;
|
|
152
|
+
if (this.config.enableReplayPersistence) this.loadReplayState();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Connect to the session gateway.
|
|
156
|
+
*/
|
|
157
|
+
connect() {
|
|
158
|
+
if (this.state === "connected" || this.state === "connecting") return;
|
|
159
|
+
const isReconnect = this.hasConnectedBefore;
|
|
160
|
+
this.setState(isReconnect ? "reconnecting" : "connecting");
|
|
161
|
+
this.connectWebSocket();
|
|
162
|
+
}
|
|
163
|
+
connectWebSocket() {
|
|
164
|
+
const url = new URL(this.config.url);
|
|
165
|
+
url.searchParams.set("token", this.currentToken);
|
|
166
|
+
this.ws = new WebSocket(url.toString());
|
|
167
|
+
this.ws.onopen = () => this.handleOpen();
|
|
168
|
+
this.ws.onclose = (event) => this.handleClose(event.code, event.reason);
|
|
169
|
+
this.ws.onerror = (_event) => {};
|
|
170
|
+
this.ws.onmessage = (event) => this.handleMessage(event.data);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Disconnect from the session gateway.
|
|
174
|
+
*/
|
|
175
|
+
disconnect() {
|
|
176
|
+
this.cleanup();
|
|
177
|
+
if (this.ws) {
|
|
178
|
+
this.ws.close(1e3, "Client disconnect");
|
|
179
|
+
this.ws = null;
|
|
180
|
+
}
|
|
181
|
+
this.setState("disconnected");
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Subscribe to additional channels.
|
|
185
|
+
*/
|
|
186
|
+
async subscribe(channels) {
|
|
187
|
+
return (await this.sendWithResponse({
|
|
188
|
+
type: "subscribe",
|
|
189
|
+
channels
|
|
190
|
+
})).channels;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Unsubscribe from channels.
|
|
194
|
+
*/
|
|
195
|
+
async unsubscribe(channels) {
|
|
196
|
+
return (await this.sendWithResponse({
|
|
197
|
+
type: "unsubscribe",
|
|
198
|
+
channels
|
|
199
|
+
})).channels;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Send a ping and wait for pong.
|
|
203
|
+
*/
|
|
204
|
+
async ping() {
|
|
205
|
+
const start = Date.now();
|
|
206
|
+
await this.sendWithResponse({ type: "ping" });
|
|
207
|
+
return Date.now() - start;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Request replay of events since a timestamp.
|
|
211
|
+
*/
|
|
212
|
+
replay(since) {
|
|
213
|
+
this.send({
|
|
214
|
+
type: "replay",
|
|
215
|
+
since
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Send terminal input via WebSocket.
|
|
220
|
+
*/
|
|
221
|
+
sendTerminalInput(terminalId, input) {
|
|
222
|
+
if (!this.isConnected()) return false;
|
|
223
|
+
this.send({
|
|
224
|
+
type: "terminal.input",
|
|
225
|
+
data: {
|
|
226
|
+
terminalId,
|
|
227
|
+
input
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Set the current session/execution context for event tracking.
|
|
234
|
+
*/
|
|
235
|
+
setSessionContext(sessionId, executionId) {
|
|
236
|
+
this.currentSessionId = sessionId;
|
|
237
|
+
if (executionId) this.currentExecutionId = executionId;
|
|
238
|
+
this.saveReplayState();
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Clear replay state (call when session ends).
|
|
242
|
+
*/
|
|
243
|
+
clearReplayState() {
|
|
244
|
+
this.lastEventId = null;
|
|
245
|
+
this.currentExecutionId = null;
|
|
246
|
+
this.currentSessionId = null;
|
|
247
|
+
this.isReplaying = false;
|
|
248
|
+
this.replayProgress = {
|
|
249
|
+
total: 0,
|
|
250
|
+
received: 0
|
|
251
|
+
};
|
|
252
|
+
this.processedEventIds.clear();
|
|
253
|
+
this.duplicatesSkipped = 0;
|
|
254
|
+
if (this.config.enableReplayPersistence) {
|
|
255
|
+
const prefix = this.config.replayStorageKeyPrefix;
|
|
256
|
+
try {
|
|
257
|
+
this.config.replayStorage.removeItem(prefix + STORAGE_KEYS.lastEventId);
|
|
258
|
+
this.config.replayStorage.removeItem(prefix + STORAGE_KEYS.executionId);
|
|
259
|
+
this.config.replayStorage.removeItem(prefix + STORAGE_KEYS.sessionId);
|
|
260
|
+
} catch {}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get current replay state for UI indicators.
|
|
265
|
+
*/
|
|
266
|
+
getReplayState() {
|
|
267
|
+
return {
|
|
268
|
+
isReplaying: this.isReplaying,
|
|
269
|
+
progress: { ...this.replayProgress }
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get connection statistics.
|
|
274
|
+
*/
|
|
275
|
+
getStats() {
|
|
276
|
+
return {
|
|
277
|
+
state: this.state,
|
|
278
|
+
connectedAt: this.connectedAt,
|
|
279
|
+
lastPingAt: this.lastPingAt,
|
|
280
|
+
lastPongAt: this.lastPongAt,
|
|
281
|
+
reconnectAttempts: this.reconnectAttempts,
|
|
282
|
+
messagesReceived: this.messagesReceived,
|
|
283
|
+
messagesSent: this.messagesSent,
|
|
284
|
+
eventsReceived: this.eventsReceived,
|
|
285
|
+
duplicatesSkipped: this.duplicatesSkipped,
|
|
286
|
+
metrics: { ...this.connectionMetrics },
|
|
287
|
+
replay: this.getReplayState()
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
getState() {
|
|
291
|
+
return this.state;
|
|
292
|
+
}
|
|
293
|
+
isConnected() {
|
|
294
|
+
return this.state === "connected";
|
|
295
|
+
}
|
|
296
|
+
getConnectionQuality() {
|
|
297
|
+
return this.connectionMetrics.quality;
|
|
298
|
+
}
|
|
299
|
+
getConnectionMetrics() {
|
|
300
|
+
return { ...this.connectionMetrics };
|
|
301
|
+
}
|
|
302
|
+
resetMetrics() {
|
|
303
|
+
this.pingLatencyHistory = [];
|
|
304
|
+
this.connectionMetrics = { ...INITIAL_METRICS };
|
|
305
|
+
this.handlers.onMetricsChange?.(this.connectionMetrics);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Update the auth token and reconnect with the new token.
|
|
309
|
+
*/
|
|
310
|
+
updateToken(token) {
|
|
311
|
+
this.currentToken = token;
|
|
312
|
+
if (this.state === "connected" && this.ws) this.ws.close(1e3, "Token refreshed");
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get the current auth token.
|
|
316
|
+
*/
|
|
317
|
+
getToken() {
|
|
318
|
+
return this.currentToken;
|
|
319
|
+
}
|
|
320
|
+
setState(state) {
|
|
321
|
+
if (this.state !== state) {
|
|
322
|
+
this.state = state;
|
|
323
|
+
this.updateConnectionQuality();
|
|
324
|
+
this.handlers.onStateChange?.(state);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
handleOpen() {
|
|
328
|
+
const isReconnect = this.hasConnectedBefore;
|
|
329
|
+
this.hasConnectedBefore = true;
|
|
330
|
+
this.setState("connected");
|
|
331
|
+
this.connectedAt = Date.now();
|
|
332
|
+
this.reconnectAttempts = 0;
|
|
333
|
+
this.missedPongCount = 0;
|
|
334
|
+
this.startPingInterval();
|
|
335
|
+
this.restoreSubscriptions();
|
|
336
|
+
if (isReconnect) {
|
|
337
|
+
this.trackReconnection();
|
|
338
|
+
this.handlers.onReconnect?.();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
handleClose(code, reason) {
|
|
342
|
+
this.cleanup();
|
|
343
|
+
this.handlers.onDisconnect?.(code, reason);
|
|
344
|
+
if (this.config.autoReconnect && this.reconnectAttempts < this.config.maxReconnectAttempts) {
|
|
345
|
+
this.setState("reconnecting");
|
|
346
|
+
this.scheduleReconnect();
|
|
347
|
+
} else this.setState("disconnected");
|
|
348
|
+
}
|
|
349
|
+
handleMessage(data) {
|
|
350
|
+
this.messagesReceived++;
|
|
351
|
+
try {
|
|
352
|
+
const raw = JSON.parse(data);
|
|
353
|
+
if (!raw.type && raw.messageType) raw.type = raw.messageType;
|
|
354
|
+
if (typeof raw.type === "string" && WIRE_TYPE_MAP[raw.type] !== void 0) raw.type = WIRE_TYPE_MAP[raw.type];
|
|
355
|
+
if (raw.data && typeof raw.data === "object") {
|
|
356
|
+
const d = raw.data;
|
|
357
|
+
if (d.sidecarId !== void 0 && d.sandboxId === void 0) d.sandboxId = d.sidecarId;
|
|
358
|
+
}
|
|
359
|
+
if (raw.type === "agent.event" && !raw.data && raw.channel) {
|
|
360
|
+
const { type, messageType, channel, id, sequenceId, timestamp, ...rest } = raw;
|
|
361
|
+
raw.data = rest;
|
|
362
|
+
}
|
|
363
|
+
const message = raw;
|
|
364
|
+
if (message.type === "pong") {
|
|
365
|
+
this.handlePong(message.timestamp);
|
|
366
|
+
this.dispatchMessage(message);
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
if ("id" in message && message.id && this.config.enableDeduplication) {
|
|
370
|
+
const eventId = message.id;
|
|
371
|
+
if (this.processedEventIds.has(eventId)) {
|
|
372
|
+
this.duplicatesSkipped++;
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
this.processedEventIds.add(eventId);
|
|
376
|
+
if (this.processedEventIds.size > this.config.maxDeduplicationSize) {
|
|
377
|
+
const entriesToRemove = Math.floor(this.config.maxDeduplicationSize * .1);
|
|
378
|
+
let removed = 0;
|
|
379
|
+
for (const oldId of this.processedEventIds) {
|
|
380
|
+
if (removed >= entriesToRemove) break;
|
|
381
|
+
this.processedEventIds.delete(oldId);
|
|
382
|
+
removed++;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
this.lastEventId = eventId;
|
|
386
|
+
this.saveReplayState();
|
|
387
|
+
}
|
|
388
|
+
this.dispatchMessage(message);
|
|
389
|
+
} catch {}
|
|
390
|
+
}
|
|
391
|
+
handlePong(timestamp) {
|
|
392
|
+
const now = Date.now();
|
|
393
|
+
this.lastPongAt = timestamp;
|
|
394
|
+
this.missedPongCount = 0;
|
|
395
|
+
this.clearPongTimeout();
|
|
396
|
+
if (this.lastPingSentAt) {
|
|
397
|
+
const latency = now - this.lastPingSentAt;
|
|
398
|
+
this.pingLatencyHistory.push(latency);
|
|
399
|
+
if (this.pingLatencyHistory.length > this.config.latencyHistorySize) this.pingLatencyHistory.shift();
|
|
400
|
+
this.updateConnectionMetrics(latency, now);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
dispatchMessage(message) {
|
|
404
|
+
if ("id" in message && message.id) {
|
|
405
|
+
const callback = this.pendingCallbacks.get(message.id);
|
|
406
|
+
if (callback) {
|
|
407
|
+
this.pendingCallbacks.delete(message.id);
|
|
408
|
+
if (message.type === "error") callback.reject(new Error(message.message));
|
|
409
|
+
else callback.resolve("data" in message ? message.data : void 0);
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
switch (message.type) {
|
|
414
|
+
case "connection.established":
|
|
415
|
+
this.handlers.onConnect?.(message.data.sessionId);
|
|
416
|
+
break;
|
|
417
|
+
case "runtime.connected":
|
|
418
|
+
this.handlers.onRuntimeConnected?.(message.data.sandboxId, message.data.baseUrl);
|
|
419
|
+
break;
|
|
420
|
+
case "runtime.disconnected":
|
|
421
|
+
this.handlers.onRuntimeDisconnected?.(message.data.sandboxId, message.data.error);
|
|
422
|
+
break;
|
|
423
|
+
case "runtime.not_found":
|
|
424
|
+
this.handlers.onRuntimeNotFound?.(message.data.sessionId, message.data.containerId, message.data.reason);
|
|
425
|
+
break;
|
|
426
|
+
case "container.ready": {
|
|
427
|
+
const data = message.data;
|
|
428
|
+
const id = data.sandboxId ?? data.sidecarId;
|
|
429
|
+
if (id) this.handlers.onContainerReady?.(id);
|
|
430
|
+
else this.handlers.onError?.("container.ready event received without sandboxId", "invalid_payload");
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
case "runtime.ready":
|
|
434
|
+
this.handlers.onRuntimeReady?.(message.data);
|
|
435
|
+
break;
|
|
436
|
+
case "port.opened":
|
|
437
|
+
this.handlers.onPortOpened?.(message.data.port, message.data.protocol, message.data.processName);
|
|
438
|
+
break;
|
|
439
|
+
case "port.closed":
|
|
440
|
+
this.handlers.onPortClosed?.(message.data.port);
|
|
441
|
+
break;
|
|
442
|
+
case "agent.event":
|
|
443
|
+
this.eventsReceived++;
|
|
444
|
+
this.trackExecutionContext(message.data);
|
|
445
|
+
this.handlers.onAgentEvent?.(message.channel, message.data, message.sequenceId);
|
|
446
|
+
break;
|
|
447
|
+
case "replay.start":
|
|
448
|
+
this.isReplaying = true;
|
|
449
|
+
this.replayProgress = {
|
|
450
|
+
total: message.total,
|
|
451
|
+
received: 0
|
|
452
|
+
};
|
|
453
|
+
this.handlers.onReplayStart?.(message.total);
|
|
454
|
+
break;
|
|
455
|
+
case "replay.progress":
|
|
456
|
+
this.replayProgress.received = message.received;
|
|
457
|
+
this.handlers.onReplayProgress?.(message.received, this.replayProgress.total);
|
|
458
|
+
break;
|
|
459
|
+
case "replay.complete":
|
|
460
|
+
this.isReplaying = false;
|
|
461
|
+
this.handlers.onReplayComplete?.(message.total);
|
|
462
|
+
break;
|
|
463
|
+
case "error":
|
|
464
|
+
this.handlers.onError?.(message.message, message.code);
|
|
465
|
+
break;
|
|
466
|
+
case "token.expiring":
|
|
467
|
+
this.handlers.onTokenExpiring?.(message.data.secondsRemaining);
|
|
468
|
+
this.handleTokenExpiring();
|
|
469
|
+
break;
|
|
470
|
+
case "token.expired":
|
|
471
|
+
this.handlers.onTokenExpired?.();
|
|
472
|
+
break;
|
|
473
|
+
case "backpressure.warning":
|
|
474
|
+
this.handlers.onBackpressureWarning?.(message.data.droppedCount, message.data.since, message.data.totalDropped);
|
|
475
|
+
break;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
trackExecutionContext(data) {
|
|
479
|
+
if (typeof data !== "object" || data === null) return;
|
|
480
|
+
const eventData = data;
|
|
481
|
+
if (eventData.executionId) {
|
|
482
|
+
this.currentExecutionId = eventData.executionId;
|
|
483
|
+
this.saveReplayState();
|
|
484
|
+
}
|
|
485
|
+
if (eventData.type === "execution.started" && eventData.sessionId) {
|
|
486
|
+
this.currentSessionId = eventData.sessionId;
|
|
487
|
+
this.saveReplayState();
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
async handleTokenExpiring() {
|
|
491
|
+
if (!this.config.onTokenRefresh || this.isRefreshingToken) return;
|
|
492
|
+
this.isRefreshingToken = true;
|
|
493
|
+
try {
|
|
494
|
+
const result = await this.config.onTokenRefresh();
|
|
495
|
+
this.updateToken(result.token);
|
|
496
|
+
} catch (error) {
|
|
497
|
+
this.handlers.onError?.(`Token refresh failed: ${error instanceof Error ? error.message : String(error)}`, "TOKEN_REFRESH_FAILED");
|
|
498
|
+
} finally {
|
|
499
|
+
this.isRefreshingToken = false;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
send(message) {
|
|
503
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
504
|
+
this.ws.send(JSON.stringify(message));
|
|
505
|
+
this.messagesSent++;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
sendWithResponse(message) {
|
|
509
|
+
return new Promise((resolve, reject) => {
|
|
510
|
+
const id = `msg_${++this.messageIdCounter}`;
|
|
511
|
+
this.pendingCallbacks.set(id, {
|
|
512
|
+
resolve,
|
|
513
|
+
reject
|
|
514
|
+
});
|
|
515
|
+
setTimeout(() => {
|
|
516
|
+
if (this.pendingCallbacks.has(id)) {
|
|
517
|
+
this.pendingCallbacks.delete(id);
|
|
518
|
+
reject(/* @__PURE__ */ new Error("Request timeout"));
|
|
519
|
+
}
|
|
520
|
+
}, 1e4);
|
|
521
|
+
this.send({
|
|
522
|
+
...message,
|
|
523
|
+
id
|
|
524
|
+
});
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
restoreSubscriptions() {
|
|
528
|
+
const channels = this.config.channels;
|
|
529
|
+
const replayOptions = {};
|
|
530
|
+
if (this.lastEventId) replayOptions.lastEventId = this.lastEventId;
|
|
531
|
+
if (this.currentExecutionId) replayOptions.executionId = this.currentExecutionId;
|
|
532
|
+
if (this.currentSessionId) replayOptions.sessionId = this.currentSessionId;
|
|
533
|
+
const hasReplayState = Object.keys(replayOptions).length > 0;
|
|
534
|
+
if (hasReplayState) {
|
|
535
|
+
this.isReplaying = true;
|
|
536
|
+
this.replayProgress = {
|
|
537
|
+
total: 0,
|
|
538
|
+
received: 0
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
this.send({
|
|
542
|
+
type: "subscribe",
|
|
543
|
+
channels,
|
|
544
|
+
...hasReplayState ? { replayOptions } : {}
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
startPingInterval() {
|
|
548
|
+
this.stopPingInterval();
|
|
549
|
+
this.pingInterval = setInterval(() => {
|
|
550
|
+
this.sendPing();
|
|
551
|
+
}, this.config.pingIntervalMs);
|
|
552
|
+
}
|
|
553
|
+
stopPingInterval() {
|
|
554
|
+
if (this.pingInterval) {
|
|
555
|
+
clearInterval(this.pingInterval);
|
|
556
|
+
this.pingInterval = null;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
sendPing() {
|
|
560
|
+
if (this.ws?.readyState !== WebSocket.OPEN) return;
|
|
561
|
+
const timeSinceLastPong = this.lastPongAt ? Date.now() - this.lastPongAt : 0;
|
|
562
|
+
if (this.lastPongAt && timeSinceLastPong > this.config.pongTimeoutMs) {
|
|
563
|
+
this.missedPongCount++;
|
|
564
|
+
this.connectionMetrics = {
|
|
565
|
+
...this.connectionMetrics,
|
|
566
|
+
missedPongCount: this.missedPongCount
|
|
567
|
+
};
|
|
568
|
+
this.updateConnectionQuality();
|
|
569
|
+
if (this.missedPongCount >= this.config.maxMissedPongs) {
|
|
570
|
+
this.ws?.close(4e3, "Pong timeout - connection unresponsive");
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
this.lastPingAt = Date.now();
|
|
575
|
+
this.lastPingSentAt = Date.now();
|
|
576
|
+
this.send({ type: "ping" });
|
|
577
|
+
this.pongTimeout = setTimeout(() => {
|
|
578
|
+
this.missedPongCount++;
|
|
579
|
+
this.connectionMetrics = {
|
|
580
|
+
...this.connectionMetrics,
|
|
581
|
+
missedPongCount: this.missedPongCount
|
|
582
|
+
};
|
|
583
|
+
this.updateConnectionQuality();
|
|
584
|
+
if (this.missedPongCount >= this.config.maxMissedPongs) this.ws?.close(4e3, "Pong timeout - connection unresponsive");
|
|
585
|
+
}, this.config.pongTimeoutMs);
|
|
586
|
+
}
|
|
587
|
+
clearPongTimeout() {
|
|
588
|
+
if (this.pongTimeout) {
|
|
589
|
+
clearTimeout(this.pongTimeout);
|
|
590
|
+
this.pongTimeout = null;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
scheduleReconnect() {
|
|
594
|
+
if (this.reconnectTimer) return;
|
|
595
|
+
this.reconnectAttempts++;
|
|
596
|
+
const delay = Math.min(this.config.initialReconnectDelayMs * 2 ** (this.reconnectAttempts - 1), this.config.maxReconnectDelayMs);
|
|
597
|
+
const jitter = delay * .3 * (Math.random() * 2 - 1);
|
|
598
|
+
this.reconnectTimer = setTimeout(() => {
|
|
599
|
+
this.reconnectTimer = null;
|
|
600
|
+
this.connect();
|
|
601
|
+
}, delay + jitter);
|
|
602
|
+
}
|
|
603
|
+
cleanup() {
|
|
604
|
+
this.stopPingInterval();
|
|
605
|
+
this.clearPongTimeout();
|
|
606
|
+
if (this.reconnectTimer) {
|
|
607
|
+
clearTimeout(this.reconnectTimer);
|
|
608
|
+
this.reconnectTimer = null;
|
|
609
|
+
}
|
|
610
|
+
for (const [id, callback] of this.pendingCallbacks) {
|
|
611
|
+
callback.reject(/* @__PURE__ */ new Error("Connection closed"));
|
|
612
|
+
this.pendingCallbacks.delete(id);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
updateConnectionMetrics(latency, pongTime) {
|
|
616
|
+
const avgLatency = this.pingLatencyHistory.length > 0 ? this.pingLatencyHistory.reduce((a, b) => a + b, 0) / this.pingLatencyHistory.length : null;
|
|
617
|
+
this.connectionMetrics = {
|
|
618
|
+
...this.connectionMetrics,
|
|
619
|
+
lastPingLatencyMs: latency,
|
|
620
|
+
avgPingLatencyMs: avgLatency,
|
|
621
|
+
missedPongCount: this.missedPongCount,
|
|
622
|
+
lastPongAt: pongTime
|
|
623
|
+
};
|
|
624
|
+
this.updateConnectionQuality();
|
|
625
|
+
}
|
|
626
|
+
updateConnectionQuality() {
|
|
627
|
+
const isConnected = this.state === "connected";
|
|
628
|
+
const quality = calculateConnectionQuality(this.connectionMetrics, isConnected);
|
|
629
|
+
if (this.connectionMetrics.quality !== quality) {
|
|
630
|
+
this.connectionMetrics = {
|
|
631
|
+
...this.connectionMetrics,
|
|
632
|
+
quality
|
|
633
|
+
};
|
|
634
|
+
this.handlers.onMetricsChange?.(this.connectionMetrics);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
trackReconnection() {
|
|
638
|
+
const now = Date.now();
|
|
639
|
+
this.connectionMetrics = {
|
|
640
|
+
...this.connectionMetrics,
|
|
641
|
+
reconnectCount: this.connectionMetrics.reconnectCount + 1,
|
|
642
|
+
lastReconnectAt: now
|
|
643
|
+
};
|
|
644
|
+
this.pingLatencyHistory = [];
|
|
645
|
+
this.updateConnectionQuality();
|
|
646
|
+
}
|
|
647
|
+
loadReplayState() {
|
|
648
|
+
if (!this.config.enableReplayPersistence) return;
|
|
649
|
+
const prefix = this.config.replayStorageKeyPrefix;
|
|
650
|
+
try {
|
|
651
|
+
this.lastEventId = this.config.replayStorage.getItem(prefix + STORAGE_KEYS.lastEventId);
|
|
652
|
+
this.currentExecutionId = this.config.replayStorage.getItem(prefix + STORAGE_KEYS.executionId);
|
|
653
|
+
this.currentSessionId = this.config.replayStorage.getItem(prefix + STORAGE_KEYS.sessionId);
|
|
654
|
+
} catch {}
|
|
655
|
+
}
|
|
656
|
+
saveReplayState() {
|
|
657
|
+
if (!this.config.enableReplayPersistence) return;
|
|
658
|
+
const prefix = this.config.replayStorageKeyPrefix;
|
|
659
|
+
try {
|
|
660
|
+
if (this.lastEventId) this.config.replayStorage.setItem(prefix + STORAGE_KEYS.lastEventId, this.lastEventId);
|
|
661
|
+
if (this.currentExecutionId) this.config.replayStorage.setItem(prefix + STORAGE_KEYS.executionId, this.currentExecutionId);
|
|
662
|
+
if (this.currentSessionId) this.config.replayStorage.setItem(prefix + STORAGE_KEYS.sessionId, this.currentSessionId);
|
|
663
|
+
} catch {}
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
//#endregion
|
|
667
|
+
export { INITIAL_METRICS, SessionGatewayClient, calculateConnectionQuality };
|