U
    #i	                     @  sv   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ erTd dlmZ G dd de	ZG dd	 d	ZdS )
    )annotationsN)TYPE_CHECKINGAnyDictList
NamedTuple)Callback)Socketc                   @  s"   e Zd ZU dZded< ded< dS )CallbackListenerz#A tuple with `event` and `callback`streventr   callbackN)__name__
__module____qualname____doc____annotations__ r   r   4/tmp/pip-unpacked-wheel-935k1slo/realtime/channel.pyr
      s   
r
   c                   @  sf   e Zd ZdZi fdddddddZd d	d
dZdd	ddZddd dddZdddddZdS )Channela7  
    `Channel` is an abstraction for a topic listener for an existing socket connection.
    Each Channel has its own topic and a list of event-callbacks that responds to messages.
    Should only be instantiated through `connection.Socket().set_channel(topic)`
    Topic-Channel has a 1-many relationship.
    r	   r   zDict[str, Any]None)sockettopicparamsreturnc                 C  s"   || _ || _|| _g | _d| _dS )z
        :param socket: Socket object
        :param topic: Topic that it subscribes to on the realtime server
        :param params:
        FN)r   r   r   	listenersZjoined)selfr   r   r   r   r   r   __init__   s
    zChannel.__init__)r   c                 C  s   t  }||   | S )z
        Wrapper for async def _join() to expose a non-async interface
        Essentially gets the only event loop and attempt joining a topic
        :return: Channel
        )asyncioZget_event_loopZrun_until_complete_join)r   Zloopr   r   r   join(   s    zChannel.joinc              
     sj   t | jdi dd}z| jjt|I dH  W n4 tk
rd } ztt	| W Y dS d}~X Y nX dS )zs
        Coroutine that attempts to join Phoenix Realtime server via a certain topic
        :return: None
        Zphx_joinN)r   r   payloadref)
dictr   r   Zws_connectionsendjsondumps	Exceptionprintr   )r   Zjoin_reqer   r   r   r   2   s    zChannel._joinr   )r   r   r   c                 C  s   t ||d}| j| | S )z
        :param event: A specific event will have a specific callback
        :param callback: Callback that takes msg payload as its first argument
        :return: Channel
        )r   r   )r
   r   append)r   r   r   Zclr   r   r   on?   s    z
Channel.on)r   r   c                   s    fdd| j D | _ dS )zX
        :param event: Stop responding to a certain event
        :return: None
        c                   s   g | ]}|j  kr|qS r   r   ).0r   r,   r   r   
<listcomp>N   s    
 zChannel.off.<locals>.<listcomp>N)r   )r   r   r   r,   r   offI   s    
zChannel.offN)	r   r   r   r   r   r    r   r+   r/   r   r   r   r   r      s   

r   )
__future__r   r   r%   typingr   r   r   r   r   Zrealtime.typesr   Zrealtime.connectionr	   r
   r   r   r   r   r   <module>   s   