§
     éÀj2L  ã                  ó|  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZmZmZmZmZ  ee¦  «                             ¦   «         j        j        Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         	 ddlmZmZmZmZmZ n# e $ r d\  ZZZZZY nw xY w	 ddl!m"Z" n# e $ r	 ddl#m"Z" Y nw xY w	 ddl$Z$dd	l%m&Z& n# e $ r dZ$eZ&Y nw xY w ej'        d
¦  «        Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d+d„Z4d,d„Z5 G d„ d
¦  «        Z6da7d e8d!<   d-d.d'„Z9e:d(k    r} ej;        ej<        ¬)¦  «          e9¦   «         Z= ej>        e= ?                    ¦   «         ¦  «         	  ej@        ¦   «          A                    ¦   «          dS # eB$ r  eCd*¦  «         Y dS w xY wdS )/a  
FreeExile WebSocket Gateway Bridge.
Translates W3C browser WebSocket frames (RFC 6455) to internal server actor packets,
supporting dual-mode framing (2-byte Opcode Protobuf and legacy JSON), live RTT telemetry,
authoritative combat actions, and zero-residual momentum verification.
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚOptionalÚSetÚTuple)Úauth_pb2Úchat_pb2Ú
combat_pb2Úmap_zone_pb2Únetwork_pb2)NNNNN)ÚGatewaySyncHelper)ÚWebSocketServerProtocolÚWsGatewayBridgeé   é   é   é   é    é!   é"   é0   é1   é@   éP   ÚopcodeÚintÚpayloadÚbytesÚreturnc                ó2   — t          j        d| ¦  «        |z   S )zCEncodes a binary frame with 2-byte big-endian uint16 opcode header.ú>H)ÚstructÚpack)r   r   s     ú9C:\Projects\FreeExile\server\gateway\ws_gateway_bridge.pyÚencode_binary_framer'   ;   s   € åŒ;�t˜VÑ$Ô$ wÑ.Ð.ó    ÚframeúTuple[int, bytes]c                ó    — t          | ¦  «        dk     rt          d¦  «        ‚t          j        d| dd…         ¦  «        d         | dd…         fS )z.Decodes a binary frame into (opcode, payload).é   z/Binary frame too short for 2-byte opcode headerr#   Nr   )ÚlenÚ
ValueErrorr$   Úunpack)r)   s    r&   Údecode_binary_framer0   @   sL   € å
ˆ5�z„z�A‚~€~ÝÐJÑKÔKÐKÝŒ=˜˜u R a RœyÑ)Ô)¨!Ô,¨e°A°B°B¬iÐ7Ð7r(   c                  óp   — e Zd Zd"d#d„Zd$d„Zd%d„Zd&d„Zd'd„Zd(d„Zd)d„Z	d*d„Z
d+d„Zd+d„Zd+d„Zd+d „Zd!S ),r   ú	127.0.0.1é�  ÚhostÚstrÚportr   c                óL  — || _         || _        d| _        d | _        t	          ¦   «         | _        d | _        d | _        i | _        t          ¦   «         | _
        	 ddlm} ddlm} n# t          $ r ddlm} ddlm} Y nw xY w |d¬¦  «        | _         |d¬¦  «        | _        d S )NFr   )ÚInstantBuyoutEngine)ÚAgentOrbServicezdata/trade_ledger.db)Údb_pathzdata/agent_delegations.db)r4   r6   Ú
is_runningÚserverÚsetÚclientsÚloopÚ_threadÚplayer_statesr   Úsync_helperÚserver.trade.two_phase_commitr8   Úserver.world.agent_orb_servicer9   ÚImportErrorÚtrade.two_phase_commitÚworld.agent_orb_serviceÚbuyout_engineÚorb_service)Úselfr4   r6   r8   r9   s        r&   Ú__init__zWsGatewayBridge.__init__H   sø   € ØˆŒ	ØˆŒ	ØˆŒØˆŒÝ58±U´UˆŒØ9=ˆŒ	Ø37ˆŒØ8:ˆÔÝ,Ñ.Ô.ˆÔð	@ØIÐIÐIÐIÐIÐIØFÐFÐFÐFÐFÐFÐFøÝð 	@ð 	@ð 	@ØBÐBÐBÐBÐBÐBØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ð	@øøøð 1Ð0Ð9OÐPÑPÔPˆÔØ*˜?Ð3NÐOÑOÔOˆÔÐÐs   ÁA& Á&A?Á>A?Ú	entity_idr!   úDict[str, Any]c                óz   — || j         vr&ddddddddt          j        ¦   «         ddœ
| j         |<   | j         |         S )zFReturns authoritative server state for an entity, creating if missing.ç        ç      @éè  r   )
ÚxÚyÚvxÚvyÚspeedÚhpÚmax_hpÚ
anim_stateÚ	last_timeÚlast_seq)rA   Útime)rJ   rL   s     r&   Ú_get_player_statez!WsGatewayBridge._get_player_state[   sQ   € à˜DÔ.Ð.Ð.à˜s¨#°SÀ3Ø d¸!Ý!œY™[œ[°að-ð -ˆDÔ˜yÑ)ð
 Ô! )Ô,Ð,r(   Úinput_xÚfloatÚinput_yúTuple[bool, float, float]c                ó4  — t          j        ||¦  «        }|dk    }|                      |¦  «        }|rd\  |d<   |d<   |d<   dS |dk    r||z  nd}|dk    r||z  nd}|                     d	d
¦  «        }	||	z  |d<   ||	z  |d<   d|d<   d|d         |d         fS )zÀ
        Zero-Residual Momentum verification:
        When input_x == 0 and input_y == 0, velocity instantly snaps to (0.0, 0.0) in frame 0.
        Returns (is_halted, vel_x, vel_y).
        gš™™™™™©?)rO   rO   r   rT   rU   rY   )TrO   rO   r   rO   rV   rP   r   F)ÚmathÚhypotr]   Úget)
rJ   rL   r^   r`   ÚmagÚ	is_haltedÚplayerÚnorm_xÚnorm_yrV   s
             r&   Úverify_zero_residual_momentumz-WsGatewayBridge.verify_zero_residual_momentume   sÍ   € õ Œj˜ 'Ñ*Ô*ˆØ˜4’Kˆ	Ø×'Ò'¨	Ñ2Ô2ˆØð 	"Ø?JÑ<ˆF�4‰L˜& ™,¨¨|Ñ(<Ø!�>Ø"%¨¢' '�˜3‘�¨sˆØ"%¨¢' '�˜3‘�¨sˆØ—
’
˜7 CÑ(Ô(ˆØ ‘~ˆˆt‰Ø ‘~ˆˆt‰Ø ˆˆ|ÑØ�f˜T”l F¨4¤LÐ0Ð0r(   r   r    r   c                ó\  — t           j                             |¦  «        }|j        pd}|                      ||j        |j        ¦  «        \  }}}|                      |¦  «        }t          j        ¦   «         }t          dt          d||d         z
  ¦  «        ¦  «        }	||d<   |s&|dxx         ||	z  z  cc<   |dxx         ||	z  z  cc<   |j        |d<   t          j        ||d         |d         ||t          |d         ¦  «        t          |d	         ¦  «        |d
         |j        ¬¦	  «	        S )zCProcesses PlayerMoveInput and returns authoritative EntitySnapshot.éé  gš™™™™™¹?gü©ñÒMbP?rZ   rR   rS   r[   rW   rX   rY   )	rL   Úpos_xÚpos_yÚ
velocity_xÚ
velocity_yÚ
current_hprX   Úanimation_stateÚlast_processed_input_seq)r   ÚPlayerMoveInputÚ
FromStringrL   rk   Údir_xÚdir_yr]   r\   ÚminÚmaxÚinput_sequenceÚEntitySnapshotr   )
rJ   r   Ú
move_inputrL   rg   rT   rU   rh   ÚnowÚdts
             r&   Ú_process_move_inputz#WsGatewayBridge._process_move_input{   s=  € å Ô0×;Ò;¸GÑDÔDˆ
ØÔ(Ð0¨Dˆ	Ø ×>Ò>Ø�zÔ'¨Ô)9ñ
ô 
Ñˆ	�2�rð ×'Ò'¨	Ñ2Ô2ˆÝŒi‰kŒkˆÝ�•c˜%  v¨kÔ':Ñ!:Ñ;Ô;Ñ<Ô<ˆØ!ˆˆ{ÑØð 	#Ø�3ˆKˆKŒK˜2 ™7Ñ"ˆKˆK‰KØ�3ˆKˆKŒK˜2 ™7Ñ"ˆKˆK‰KØ'Ô6ˆˆzÑÝÔ)Ø v¨c¤{¸&À¼+Ø bµS¸À¼Ñ5FÔ5FÝ�v˜hÔ'Ñ(Ô(¸&ÀÔ:NØ%/Ô%>ð	
ñ 
ô 
ð 	
r(   Ú	websocketr   r   ÚNonec              ƒ  ó\  K  — t           €dS |t          k    rW|                      |¦  «        }|                     t	          t
          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |t          k    r£t           j         	                    |¦  «        }t          j        |j
        t          t          j        ¦   «         dz  ¦  «        |j        ¬¦  «        }|                     t	          t          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |t
          k    r¯t           j         	                    |¦  «        }|                      |j        ¦  «        }|j        |j        c|d<   |d<   |j        |j        |j        c|d<   |d<   |d<   |                     t	          t
          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |t,          k    rjt/          j        d	d
t.          j        j        dd¬¦  «        }|                     t	          t,          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |t6          k    r“t8          j         	                    |¦  «        }	t9          j        |	j        pddddddt8          j         j!        d¬¦  «        }
|                     t	          tD          |
                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |tF          k    �r.t8          j$         	                    |¦  «        }|                      |j        pd¦  «        }d|j%        dz  |j&        dz  c|d<   |d<   |d<   |dxx         |j%        dz  z  cc<   |dxx         |j&        dz  z  cc<   t          j        |j        pd|d         |d         |d         |d         t          |d         ¦  «        t          |d         ¦  «        d¬¦  «        }|                     t	          t
          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |tD          k    rat8          j         	                    |¦  «        }|                     t	          tD          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |tN          k    r‹t.          j(         	                    |¦  «        }d	}t/          j        |d
t.          j        j        dd¬¦  «        }|                     t	          t,          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |tR          k    rat.          j*         	                    |¦  «        }|                     t	          tR          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS |tV          dfv r‹tX          j-         	                    |¦  «        }t	          tV          |                     ¦   «         ¦  «        }t]          | j/        ¦  «        D ].}	 |                     |¦  «        ƒ d{V —† Œ# t`          $ r Y Œ+w xY wdS |tb          k    rzt          j        dt          t          j        ¦   «         dz  ¦  «        d¬¦  «        }|                     t	          t          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† dS dS )z3Dispatches binary protobuf frames by 2-byte opcode.NrQ   )Úsequence_numberÚtimestamp_msÚnoncerR   rS   rT   rU   rY   Úzone_boundless_sanctuaryu   Doanh Tráº¡i Báº¿n LÆ°u Ä�Ã yg      ™@)Úzone_idÚnameÚ	zone_typeÚbounds_widthÚbounds_heightrm   i'  é´   é–   Fr   )Úsource_entity_idÚtarget_entity_idÚ
raw_damageÚmitigated_damageÚis_criticalÚtarget_evadedÚelementÚrecoil_damage_to_sourceé   g      (@g      ø?rW   rX   )rL   rn   ro   rp   rq   rr   rX   rs   é`   r   s   AUTH_SIMULATOR_TOKEN_VALID)r„   r…   Úencrypted_payload)2r   ÚOPCODE_PLAYER_MOVE_INPUTr€   Úsendr'   ÚOPCODE_ENTITY_STATEÚSerializeToStringÚOPCODE_PACKET_ENVELOPEÚPacketEnveloperv   r„   r   r\   r†   r|   r]   rL   rn   ro   rp   rq   rs   ÚOPCODE_ZONE_DATAr   ÚZoneInfoPayloadÚZoneTypeÚZONE_TYPE_SANCTUARYÚOPCODE_CAST_MARTIAL_SKILLr   ÚCastMartialSkillRequestÚCombatDamageEventÚcaster_entity_idÚFiveElementsTypeÚELEMENT_PHYSICAL_KIMÚOPCODE_COMBAT_DAMAGE_EVENTÚOPCODE_PHANTOM_EVASIONÚPhantomEvasionRequestÚevasion_dir_xÚevasion_dir_yÚOPCODE_ENTER_ZONE_REQUESTÚEnterZoneRequestÚOPCODE_ZONE_PORTAL_DATAÚZonePortalDataÚOPCODE_CHAT_MESSAGEr   ÚChatMessageÚlistr>   Ú	ExceptionÚOPCODE_AUTH_REQUEST)rJ   r�   r   r   ÚsnapÚenvÚresprh   ÚzoneÚ	skill_reqÚdmg_evtÚeva_reqÚpÚdmgÚzone_reqÚ	target_idÚ	zone_infoÚportalÚchat_msgÚbcastÚclients                        r&   Ú_handle_binary_packetz%WsGatewayBridge._handle_binary_packet‘   sÍ  è è € õ ÐØˆFàÕ-Ò-Ð-Ø×+Ò+¨GÑ4Ô4ˆDØ—.’.Õ!4Õ5HÈ$×J`ÒJ`ÑJbÔJbÑ!cÔ!cÑdÔdÐdÐdÐdÐdÐdÐdÐdÐdÐdØÕ-Ò-Ð-ÝÔ,×7Ò7¸Ñ@Ô@ˆCÝÔ-Ø #Ô 3Å#ÅdÄiÁkÄkÐTXÑFXÑBYÔBYÐadÔajðñ ô ˆDð —.’.Õ!4Õ5KÈT×McÒMcÑMeÔMeÑ!fÔ!fÑgÔgÐgÐgÐgÐgÐgÐgÐgÐgÐgØÕ*Ò*Ð*ÝÔ-×8Ò8¸ÑAÔAˆDØ×+Ò+¨D¬NÑ;Ô;ˆFØ'+¤z°4´:Ð$ˆF�3‰K˜ ™Ø?C¼ÐPTÔP_ÐaeÔauÐ<ˆF�4‰L˜& ™,¨¨|Ñ(<Ø—.’.Õ!4Õ5HÈ$×J`ÒJ`ÑJbÔJbÑ!cÔ!cÑdÔdÐdÐdÐdÐdÐdÐdÐdÐdÐdØÕ'Ò'Ð'ÝÔ/Ø2Ð9XÝ&Ô/ÔCÐRXÐhnðñ ô ˆDð —.’.Õ!4Õ5EÀt×G]ÒG]ÑG_ÔG_Ñ!`Ô!`ÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐaØÕ0Ò0Ð0Ý"Ô:×EÒEÀgÑNÔNˆIÝ Ô2Ø!*Ô!;Ð!C¸tÐVZØ°À%ÐW\Ý"Ô3ÔHÐbcðñ ô ˆGð
 —.’.Õ!4Õ5OÐQX×QjÒQjÑQlÔQlÑ!mÔ!mÑnÔnÐnÐnÐnÐnÐnÐnÐnÐnÐnØÕ-Ò-Ñ-Ý Ô6×AÒAÀ'ÑJÔJˆGØ×&Ò& wÔ'8Ð'@¸DÑAÔAˆAØ01°7Ô3HÈ4Ñ3OÐQXÔQfÐimÑQmÐ-ˆAˆl‰O˜Q˜t™W a¨¡gØˆcˆFˆFŒF�gÔ+¨cÑ1Ñ1ˆFˆF‰FØˆcˆFˆFŒF�gÔ+¨cÑ1Ñ1ˆFˆF‰FÝÔ-Ø!Ô+Ð3¨t¸1¸S¼6ÈÈ3ÌÐ\]Ð^bÔ\cØ˜Tœ7­s°1°T´7©|¬|ÅCÈÈ(ÌÑDTÔDTÐfgðñ ô ˆDð —.’.Õ!4Õ5HÈ$×J`ÒJ`ÑJbÔJbÑ!cÔ!cÑdÔdÐdÐdÐdÐdÐdÐdÐdÐdÐdØÕ1Ò1Ð1ÝÔ.×9Ò9¸'ÑBÔBˆCØ—.’.Õ!4Õ5OÐQT×QfÒQfÑQhÔQhÑ!iÔ!iÑjÔjÐjÐjÐjÐjÐjÐjÐjÐjÐjØÕ0Ò0Ð0Ý#Ô4×?Ò?ÀÑHÔHˆHØ2ˆIÝ$Ô4Ø!Ð(GÝ&Ô/ÔCÐRXÐhnðñ ô ˆIð —.’.Õ!4Õ5EÀy×GbÒGbÑGdÔGdÑ!eÔ!eÑfÔfÐfÐfÐfÐfÐfÐfÐfÐfÐfØÕ.Ò.Ð.Ý!Ô0×;Ò;¸GÑDÔDˆFØ—.’.Õ!4Õ5LÈf×NfÒNfÑNhÔNhÑ!iÔ!iÑjÔjÐjÐjÐjÐjÐjÐjÐjÐjÐjØÕ+¨VÐ4Ð4Ð4ÝÔ+×6Ò6°wÑ?Ô?ˆHÝ'Õ(;¸X×=WÒ=WÑ=YÔ=YÑZÔZˆEÝ˜tœ|Ñ,Ô,ð ð �ðØ Ÿ+š+ eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝ ð ð ð Ø�Dðøøøðð ð
 Õ*Ò*Ð*ÝÔ,Ø !µµD´I±K´KÀ$Ñ4FÑ0GÔ0GÐ[xðñ ô ˆCð —.’.Õ!4Õ5KÈS×MbÒMbÑMdÔMdÑ!eÔ!eÑfÔfÐfÐfÐfÐfÐfÐfÐfÐfÐfð	 +Ð*s   ×9XØ
X"Ø!X"c              ƒ  ó¦  K  — |                      dd¦  «        }|dk    ro|                     t          j        d|                      dt	          j        ¦   «         dz  ¦  «        t	          j        ¦   «         dz  dœ¦  «        ¦  «        ƒ d{V —† dS |d	k    r¾t          d
t          dt          |                      dd¦  «        ¦  «        ¦  «        ¦  «        }|                     t          j        d|                      dd¦  «        |t          |                      dd¦  «        ¦  «        dt	          j        ¦   «         dz  dœ¦  «        ¦  «        ƒ d{V —† dS |dk    r`|                      dd¦  «         	                    d¦  «        }|                     t          j        d||rdnddœ¦  «        ¦  «        ƒ d{V —† dS |dv r_|                      dd¦  «        }| j
                             |¦  «        }|                     t          j        |¦  «        ¦  «        ƒ d{V —† dS |dk    r_|                      d d!¦  «        }| j
                             |¦  «        }	|                     t          j        |	¦  «        ¦  «        ƒ d{V —† dS |d"k    rv|                      d d!¦  «        }|                      d#d¦  «        }
| j
                             ||
¦  «        }|                     t          j        |¦  «        ¦  «        ƒ d{V —† dS | 	                    d$¦  «        �r½d%dl}|j                              d&¦  «        d'k    r2|                     t          j        d(d)d*œ¦  «        ¦  «        ƒ d{V —† dS |d+k    ra|                      d,¦  «        }| j                             |¦  «         |                     t          j        d-|d.œ¦  «        ¦  «        ƒ d{V —† dS |d/k    r¸|                      d,¦  «        }d%d0lm} d%dl} |t+          |                     ¦   «         ¦  «        ||                      d1d2¦  «        d3d
¬4¦  «        }|| j        j        |         j        |j        <   |                     t          j        d5|j        d6œ¦  «        ¦  «        ƒ d{V —† dS |d7k    r—|                      d,¦  «        }|                      d8d3¦  «        }|                      d9d:¦  «        }| j        j        |         j        |xx         |z  cc<   |                     t          j        dd;i¦  «        ¦  «        ƒ d{V —† dS |d<k    r©|                      d=¦  «        }|                      d>¦  «        }|                      d?¦  «        }| j                             |||d3|                      d@d
¦  «        ¦  «        \  }}}|                     t          j        dA|||dBœ¦  «        ¦  «        ƒ d{V —† dS |dCk    rb|                      d ¦  «        }| j                             |dDdE¦  «         |                     t          j        ddFi¦  «        ¦  «        ƒ d{V —† dS |dGk    rŒ|                      d ¦  «        }d%dHlm}m } d%dIl!m"}  ||j#        ¬J¦  «        }| j         $                    |dD|j%        |¦  «        }|                     t          j        dK|dudLœ¦  «        ¦  «        ƒ d{V —† dS dS dS )Mz>Dispatches legacy text JSON frames for backward compatibility.ÚtypeÚ ÚpingÚpongÚ	client_tsrQ   )rÊ   rÎ   Ú	server_tsNÚskill_intenté
   iÜ  ÚdamagerŽ   Údamage_eventrÂ   ÚdummyÚis_critFT)rÊ   rÂ   rÒ   rÕ   ÚverifiedÚ	timestampÚauth_simulatorÚtokenÚDEV_SIMULATOR_TOKENÚauth_resultÚ	simulatorÚguest)rÊ   Ú
authorizedÚrole)Úrequest_zone_dataÚ
enter_zonerˆ   Úzone_tang_kiem_nhaiÚrequest_quest_syncÚ	player_idÚplayer_1Úmonster_kill_reportÚ
monster_idÚe2e_r   ÚFREEEXILE_DEV_MODEÚ1ÚerrorzDev endpoints disabled)rÊ   ÚmsgÚe2e_register_accountÚ
account_idÚe2e_register_success)rÊ   rî   Úe2e_add_item)Ú	StashItemÚ
item_classÚweaponÚ	ThienMenh)Ú	item_uuidÚowner_account_idÚ	item_nameÚasking_price_currencyÚasking_price_amountÚe2e_item_added)rÊ   rõ   Úe2e_add_currencyÚcurrencyÚamountéd   Úe2e_currency_addedÚ
e2e_buyoutÚbuyerÚsellerrõ   ÚpriceÚe2e_buyout_result)rÊ   Úsuccessrì   Útx_idÚe2e_grant_orbÚitem_agent_orb_tier1r   Úe2e_orb_grantedÚe2e_activate_agent)ÚLLMProviderConfigÚLLMProviderType)ÚTacticalStance)ÚproviderÚe2e_agent_activated)rÊ   r  )&re   r›   ÚjsonÚdumpsr\   rz   ry   r   ÚboolÚ
startswithrB   Úgenerate_zone_monsters_payloadÚget_player_quests_payloadÚprocess_kill_eventÚosÚenvironrH   Úregister_accountrC   rñ   Úuuidr5   Úuuid4ÚaccountsÚitemsrõ   Ú
currenciesÚexecute_instant_buyoutrI   Úgrant_agent_orbÚ server.agent.llm_provider_clientr  r  Ú server.agent.agent_decision_corer  ÚLOCAL_TACTICALÚactivate_delegationÚBALANCED)rJ   r�   r   Úmsg_typerÀ   Úvalidrˆ   Úzone_payloadrä   Úquest_payloadrç   Úupdate_payloadr  Úacc_idrñ   r  Úitemrü   rý   r  r  rõ   r  rì   r  r  r  r  ÚcfgÚsesss                                 r&   Ú_handle_json_packetz#WsGatewayBridge._handle_json_packetÜ   sÞ  è è € ð —;’;˜v rÑ*Ô*ˆØ�vÒÐØ—.’.¥¤Ø¨W¯[ª[¸ÅdÄiÁkÄkÐTXÑFXÑ-YÔ-YÕhlÔhqÑhsÔhsÐvzÑhzð-ð -ñ "ô "ñ ô ð ð ð ð ð ð ð ð ð ð ˜Ò'Ð'Ý�b�#˜d¥C¨¯ª°H¸cÑ(BÔ(BÑ$CÔ$CÑDÔDÑEÔEˆCØ—.’.¥¤Ø&°W·[²[ÀÈgÑ5VÔ5VÐbeÝ §¢¨I°uÑ =Ô =Ñ>Ô>ÈDÕ_cÔ_hÑ_jÔ_jÐmqÑ_qð-ð -ñ "ô "ñ ô ð ð ð ð ð ð ð ð ð ð Ð)Ò)Ð)Ø—K’K ¨Ñ,Ô,×7Ò7Ð8MÑNÔNˆEØ—.’.¥¤Ø%°UÐSXÐDeÀKÀKÐ^eð-ð -ñ "ô "ñ ô ð ð ð ð ð ð ð ð ð ð Ð<Ð<Ð<Ø—k’k )Ð-BÑCÔCˆGØÔ+×JÒJÈ7ÑSÔSˆLØ—.’.¥¤¨LÑ!9Ô!9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ØÐ-Ò-Ð-ØŸš K°Ñ<Ô<ˆIØ Ô,×FÒFÀyÑQÔQˆMØ—.’.¥¤¨MÑ!:Ô!:Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØÐ.Ò.Ð.ØŸš K°Ñ<Ô<ˆIØ Ÿš \°2Ñ6Ô6ˆJØ!Ô-×@Ò@ÀÈJÑWÔWˆNØ—.’.¥¤¨NÑ!;Ô!;Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø× Ò  Ñ(Ô(ñ /	oØˆIˆIˆIØŒz�~Š~Ð2Ñ3Ô3°sÒ:Ð:Ø—n’n¥T¤Z¸ÐIaÐ0bÐ0bÑ%cÔ%cÑdÔdÐdÐdÐdÐdÐdÐdÐdØ�àÐ1Ò1Ð1Ø Ÿš \Ñ2Ô2�ØÔ"×3Ò3°FÑ;Ô;Ð;Ø—n’n¥T¤ZÐ9OÐ_eÐ0fÐ0fÑ%gÔ%gÑhÔhÐhÐhÐhÐhÐhÐhÐhÐhÐhØ˜^Ò+Ð+Ø Ÿš \Ñ2Ô2�ØCÐCÐCÐCÐCÐCØ���Ø �yÝ! $§*¢*¡,¤,Ñ/Ô/Ø%+Ø%Ÿkšk¨,¸ÑAÔAØ*5Ø(*ðñ ô �ð MQ�Ô"Ô+¨FÔ3Ô9¸$¼.ÑIØ—n’n¥T¤ZÐ9IÐX\ÔXfÐ0gÐ0gÑ%hÔ%hÑiÔiÐiÐiÐiÐiÐiÐiÐiÐiÐiØÐ/Ò/Ð/Ø Ÿš \Ñ2Ô2�Ø"Ÿ;š; z°;Ñ?Ô?�Ø Ÿš X¨sÑ3Ô3�ØÔ"Ô+¨FÔ3Ô>¸xÐHÐHÔHÈFÑRÐHÐHÑHØ—n’n¥T¤Z°Ð9MÐ0NÑ%OÔ%OÑPÔPÐPÐPÐPÐPÐPÐPÐPÐPÐPØ˜\Ò)Ð)ØŸš GÑ,Ô,�Ø Ÿš XÑ.Ô.�Ø#ŸKšK¨Ñ4Ô4�	Ø&*Ô&8×&OÒ&OØ˜6 9¨k¸7¿;º;ÀwÐPRÑ;SÔ;Sñ'ô 'Ñ#�˜˜eð  —n’n¥T¤ZÐ9LÐY`ÐilÐw|Ð0}Ð0}Ñ%~Ô%~ÑÔÐÐÐÐÐÐÐÐÐØ˜_Ò,Ð,Ø#ŸKšK¨Ñ4Ô4�	ØÔ ×0Ò0°Ð<RÐTUÑVÔVÐVØ—n’n¥T¤Z°Ð9JÐ0KÑ%LÔ%LÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMØÐ1Ò1Ð1Ø#ŸKšK¨Ñ4Ô4�	Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_ØKÐKÐKÐKÐKÐKØ'Ð'°Ô1OÐPÑPÔP�ØÔ'×;Ò;¸IÐG]Ð_mÔ_vÐx{Ñ|Ô|�Ø—n’n¥T¤ZÐ9NÐ[_ÐgkÐ[kÐ0lÐ0lÑ%mÔ%mÑnÔnÐnÐnÐnÐnÐnÐnÐnÐnÐnð_/	oð /	oðR 2Ð1r(   c           	   ƒ  óÖ  K  — | j                              |¦  «         t                               dt	          |dd¦  «        ¦  «         	 |                     t          j        dt          j        ¦   «         dddœ¦  «        ¦  «        ƒ d {V —† |2 3 d {V —†}	 t          |t          t          f¦  «        rPt          |¦  «        dk    r<t          t          |¦  «        ¦  «        \  }}|                      |||¦  «        ƒ d {V —† nÆt          |t          ¦  «        r±|                     ¦   «         }|                     d	¦  «        r/|                      |t          j        |¦  «        ¦  «        ƒ d {V —† nY|                     d
d¬¦  «        }t          |¦  «        dk    r/t          |¦  «        \  }}|                      |||¦  «        ƒ d {V —† �Œ<# t*          $ r&}t                               d|¦  «         Y d }~�Œgd }~ww xY w6 n2# t*          $ r%}t                               d|¦  «         Y d }~nd }~ww xY w| j                              |¦  «         d S # | j                              |¦  «         w xY w)Nz)Client connected to WS Gateway Bridge: %sÚremote_addressrÇ   ÚwelcomeTz
2.0-Bridge)rÊ   Úserver_timeÚauthoritativeÚversionr,   ú{Úlatin1Úignore)ÚerrorszError processing frame: %szWS connection ended: %s)r>   ÚaddÚloggerÚinfoÚgetattrr›   r  r  r\   Ú
isinstancer    Ú	bytearrayr-   r0   rÈ   r5   Ústripr  r/  ÚloadsÚencoder¶   ÚdebugÚdiscard)	rJ   r�   Úraw_msgÚopÚbodyÚsÚraw_bÚexÚes	            r&   Ú_handle_connectionz"WsGatewayBridge._handle_connection.  sÌ  è è € ØŒ×Ò˜Ñ#Ô#Ð#Ý�ŠÐ?ÅÈÐTdÐfnÑAoÔAoÑpÔpÐpð	,Ø—.’.¥¤Ø!µ$´)±+´+ÐPTÐamð-ð -ñ "ô "ñ ô ð ð ð ð ð ð ð ð "+ð ð ð ð ð ð ð �gðÝ! '­Eµ9Ð+=Ñ>Ô>ð VÝ˜w™<œ<¨1Ò,Ð,Ý':½5À¹>¼>Ñ'JÔ'J™H˜B Ø"&×"<Ò"<¸YÈÈDÑ"QÔ"QÐQÐQÐQÐQÐQÐQÐQøÝ# G­SÑ1Ô1ð VØ#ŸMšM™OœO˜ØŸ<š<¨Ñ,Ô,ð VØ"&×":Ò":¸9ÅdÄjÐQXÑFYÔFYÑ"ZÔ"ZÐZÐZÐZÐZÐZÐZÐZÐZà$+§N¢N°8ÀH NÑ$MÔ$M˜EÝ" 5™zœz¨Qš˜Ý+>¸uÑ+EÔ+E¡  DØ&*×&@Ò&@ÀÈBÐPTÑ&UÔ&UÐ UÐ UÐ UÐ UÐ UÐ UÐ UùøÝ ð ð ð Ý—L’LÐ!=¸rÑBÔBÐBØ�H�H�H‘Høøøøðøøøð "+ øõ$ ð 	7ð 	7ð 	7Ý�LŠLÐ2°AÑ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð	7øøøð ŒL× Ò  Ñ+Ô+Ð+Ð+Ð+øˆDŒL× Ò  Ñ+Ô+Ð+Ð+øøøsh   ÁAG> ÂG<ÂG> ÂD2G	ÇG> Ç	
G9ÇG4Ç.G> Ç4G9Ç9G> Ç=I Ç>
H-ÈH(È#I È(H-È-I ÉI(c                óÆ   ‡ ‡— ‰ j         r‰ j                              ¦   «         sdS t          j        |¦  «        Šˆˆ fd„}t	          j         |¦   «         ‰ j         ¦  «         dS )z3Broadcasts a JSON message to all connected clients.Nc               “  ó’   •K  — t          ‰j        ¦  «        D ].} 	 |                      ‰¦  «        ƒ d {V —† Œ# t          $ r Y Œ+w xY wd S ©N)rµ   r>   r›   r¶   )rÇ   rì   rJ   s    €€r&   Ú_bcastz.WsGatewayBridge.broadcast_json.<locals>._bcastR  sv   øè è € Ý˜tœ|Ñ,Ô,ð ð �ðØ Ÿ+š+ cÑ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øÝ ð ð ð Ø�Dðøøøðð s   ›7·
AÁA)r?   r;   r  r  ÚasyncioÚrun_coroutine_threadsafe)rJ   r   rP  rì   s   `  @r&   Úbroadcast_jsonzWsGatewayBridge.broadcast_jsonL  sx   øø€ àŒyð 	 ¤	× 4Ò 4Ñ 6Ô 6ð 	ØˆFÝŒj˜Ñ!Ô!ˆð	ð 	ð 	ð 	ð 	ð 	õ 	Ô(¨¨©¬°4´9Ñ=Ô=Ð=Ð=Ð=r(   c              ƒ  óð   K  — t           €t          d¦  «        ‚d| _        t          j        | j        | j        | j        ¦  «        ƒ d {V —†| _        t           	                    d| j        | j        ¦  «         d S )Nz websockets library not installedTz'WsGatewayBridge listening on ws://%s:%d)
Ú
websocketsÚRuntimeErrorr;   ÚserverL  r4   r6   r<   r;  r<  ©rJ   s    r&   Ústart_serverzWsGatewayBridge.start_server[  st   è è € ÝÐÝÐAÑBÔBÐBØˆŒÝ&Ô,¨TÔ-DÀdÄiÐQUÔQZÑ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[ˆŒÝ�ŠÐ=¸t¼yÈ$Ì)ÑTÔTÐTÐTÐTr(   c              ƒ  ó,  K  — d| _         t          | j        ¦  «        D ]-}	 |                     ¦   «         ƒ d {V —† Œ# t          $ r Y Œ*w xY w| j        rA| j                             ¦   «          | j                             ¦   «         ƒ d {V —† d | _        d S d S )NF)r;   rµ   r>   Úcloser¶   r<   Úwait_closed)rJ   rÇ   s     r&   Ústop_serverzWsGatewayBridge.stop_serverb  sÇ   è è € ØˆŒÝ˜4œ<Ñ(Ô(ð 	ð 	ˆFðØ—l’l‘n”nÐ$Ð$Ð$Ð$Ð$Ð$Ð$Ð$øÝð ð ð Ø�ðøøøàŒ;ð 	ØŒK×ÒÑÔÐØ”+×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØˆDŒKˆKˆKð	ð 	s   ¡<¼
A	ÁA	c                óè   ‡ — ‰ j         r‰ j                              ¦   «         rdS ˆ fd„}t          j        |dd¬¦  «        ‰ _         ‰ j                              ¦   «          t          j        d¦  «         dS )zHStarts the WebSocket bridge on a dedicated background event loop thread.Nc                 óô   •— t          j        ¦   «         ‰ _        t          j        ‰ j        ¦  «         ‰ j                             ‰                      ¦   «         ¦  «         ‰ j                             ¦   «          d S rO  )rQ  Únew_event_loopr?   Úset_event_loopÚrun_until_completerY  Úrun_foreverrX  s   €r&   Ú	_run_loopz3WsGatewayBridge.start_background.<locals>._run_loops  sb   ø€ ÝÔ.Ñ0Ô0ˆDŒIÝÔ" 4¤9Ñ-Ô-Ð-ØŒI×(Ò(¨×):Ò):Ñ)<Ô)<Ñ=Ô=Ð=ØŒI×!Ò!Ñ#Ô#Ð#Ð#Ð#r(   TÚWsGatewayBridgeThread)ÚtargetÚdaemonr‰   g333333Ó?)r@   Úis_aliveÚ	threadingÚThreadÚstartr\   Úsleep)rJ   rd  s   ` r&   Ústart_backgroundz WsGatewayBridge.start_backgroundn  s�   ø€ àŒ<ð 	˜DœL×1Ò1Ñ3Ô3ð 	ØˆFð	$ð 	$ð 	$ð 	$ð 	$õ !Ô'¨yÀÐLcÐdÑdÔdˆŒØŒ×ÒÑÔÐÝŒ
�3‰Œˆˆˆr(   c                óä   — | j         r=| j                              ¦   «         r$| j                              | j         j        ¦  «         | j        r$| j                             d¬¦  «         d | _        d S d S )Ng      ð?)Útimeout)r?   r;   Úcall_soon_threadsafeÚstopr@   ÚjoinrX  s    r&   Ústop_backgroundzWsGatewayBridge.stop_background}  ss   € ØŒ9ð 	;˜œ×-Ò-Ñ/Ô/ð 	;ØŒI×*Ò*¨4¬9¬>Ñ:Ô:Ð:ØŒ<ð 	 ØŒL×Ò cÐÑ*Ô*Ð*ØˆDŒLˆLˆLð	 ð 	 r(   N©r2   r3   )r4   r5   r6   r   )rL   r   r!   rM   )rL   r   r^   r_   r`   r_   r!   ra   )r   r    r!   r   )r�   r   r   r   r   r    r!   r‚   )r�   r   r   rM   r!   r‚   )r�   r   r!   r‚   )r   rM   r!   r‚   )r!   r‚   )Ú__name__Ú
__module__Ú__qualname__rK   r]   rk   r€   rÈ   r/  rL  rS  rY  r]  rm  rs  © r(   r&   r   r   G   s$  € € € € € ðPð Pð Pð Pð Pð&-ð -ð -ð -ð1ð 1ð 1ð 1ð,
ð 
ð 
ð 
ð,Igð Igð Igð IgðVPoð Poð Poð Poðd,ð ,ð ,ð ,ð<>ð >ð >ð >ðUð Uð Uð Uð
ð 
ð 
ð 
ðð ð ð ð ð  ð  ð  ð  ð  r(   zOptional[WsGatewayBridge]Ú_global_bridger2   r3   r4   r5   r6   c                ó@   — t           €t          | |¬¦  «        a t           S )N©r4   r6   )ry  r   r{  s     r&   Úget_bridge_instancer|  ˆ  s    € åÐÝ(¨d¸Ð>Ñ>Ô>ˆÝÐr(   Ú__main__)ÚlevelzStopping WsGatewayBridge...)r   r   r   r    r!   r    )r)   r    r!   r*   rt  )r4   r5   r6   r   r!   r   )DÚ__doc__Ú
__future__r   rQ  r  Úloggingrc   r$   Úsysri  r\   Úpathlibr   Útypingr   r   r   r   r	   Ú__file__ÚresolveÚparentÚ_SERVER_ROOTr5   ÚpathÚinsertÚprotor
   r   r   r   r   rE   Ú"server.gateway.gateway_sync_helperr   Úgateway.gateway_sync_helperrU  Úwebsockets.serverr   Ú	getLoggerr;  rž   rš   rœ   r    r¤   r«   rª   r¯   r±   r³   r·   r'   r0   r   ry  Ú__annotations__r|  ru  ÚbasicConfigÚINFOÚbridgeÚrunrY  Úget_event_looprc  ÚKeyboardInterruptÚprintrx  r(   r&   ú<module>r˜     s   ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)ð]ØOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOøØð ]ð ]ð ]Ø@\Ñ=€K�˜\¨8°X°X°Xð]øøøð>ØDÐDÐDÐDÐDÐDÐDøØð >ð >ð >Ø=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ð>øøøð"ØÐÐÐØ9Ð9Ð9Ð9Ð9Ð9Ð9øØð "ð "ð "Ø€JØ!ÐÐÐð"øøøð 
ˆÔ	Ð,Ñ	-Ô	-€ð  Ð Ø!Ð ØÐ ØÐ Ø"Ð ØÐ Ø#Ð Ø"Ð Ø Ð ØÐ ØÐ ð/ð /ð /ð /ð
8ð 8ð 8ð 8ð{ ð { ð { ð { ð { ñ { ô { ð { ð|	 -1€Ð 0Ð 0Ð 0Ñ 0ðð ð ð ð ð ˆzÒÐØ€GÔ˜gœlÐ+Ñ+Ô+Ð+Ø Ð Ñ"Ô"€FØ€G„K�×#Ò#Ñ%Ô%Ñ&Ô&Ð&ð-ØˆÔÑ Ô ×,Ò,Ñ.Ô.Ð.Ð.Ð.øØð -ð -ð -ØˆÐ+Ñ,Ô,Ð,Ð,Ð,Ð,ð-øøøð ÐsH   ÂB+ Â+B;Â:B;Â?C ÃCÃCÃ
C# Ã#	C/Ã.C/Æ!F% Æ%F9Æ8F9