
    ZTh$                       U d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZ ddlZddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& ejN                  Z(de)d<   ejN                  Z*de)d<   d dZ+	 d!	 	 	 	 	 d"dZ,	 d!	 	 	 	 	 d#dZ-	 d!	 	 	 	 	 d"dZ.	 d!	 	 	 	 	 d#dZ/	 d!	 	 	 	 	 d$dZ0	 d!	 	 	 	 	 d%dZ1d&dZ2	 d!	 	 	 	 	 d'dZ3	 d!	 	 	 	 	 d(dZ4d)dZ5d*dZ6d+dZ7 G d de      Z8y),z
This module is concerned with creating a gRPC transport channel specifically for
interacting with Sift's gRPC API. the `use_sift_channel` method creates said channel
and should generally be used within a with-block for correct resource management.
    )annotations)PackageNotFoundErrorversion)AnyDictListOptionalTuple	TypedDictUnioncast)ParseResulturlparseN)NotRequired	TypeAlias)ClientAsyncInterceptor)MetadataAsyncInterceptor)ClientInterceptor)MetadataMetadataInterceptor)RetryPolicy)DEFAULT_KEEPALIVE_CONFIGKeepaliveConfigr   SiftChannelSiftAsyncChannelc                   | st        j                         S 	 ddl}ddlm} |j                         }|j                  d      }|D cg c]  }|j                  |j                  |        }}|D cg c]  }|j                  |j                  |        }}dj                  |      }t        j                  |      S c c}w c c}w # t        $ r}	t        d      |	d}	~	ww xY w)z}
    Returns SSL credentials for use with gRPC.
    Workaround for this issue: https://github.com/grpc/grpc/issues/29682
    r   N)cryptoT)binary_form    zMissing required dependencies for cert_via_openssl. Run `pip install sift-stack-py[openssl]` to install the required dependencies.)grpcssl_channel_credentialssslOpenSSLr   create_default_contextget_ca_certsload_certificateFILETYPE_ASN1dump_certificateFILETYPE_PEMjoinImportError	Exception)
cert_via_opensslr"   r   ssl_context	certs_derx
certs_x509	certs_pemcerts_byteses
             [/home/www/backend.miabetepe.com/venv/lib/python3.12/site-packages/sift_py/grpc/transport.pyget_ssl_credentialsr6      s    
 ++--"002,,,>	PYZ1f--f.B.BAFZ
ZNXYV,,V-@-@!DY	Yhhy)++K88	 [Y   Q
	s5   0C #B<+C 1#C'C <
C 	C CC SiftChannelConfigc                "   | j                  dd      }| j                  dd      }|st        | |      S t        |      }t        |       }t	        | d   |      }t        j                  |||      }t        | |      }t        j                  |g| S )a  
    Returns an intercepted channel that is meant to be used across all services that
    make RPCs to Sift's API. It is highly encouraged to use this within a with-block
    for correct resource clean-up.

    Should an RPC fail for a reason that isn't explicitly controlled by Sift, `SiftChannel`
    will automatically leverage gRPC's retry mechanism to try and recover until the max-attempts
    are exceeded, after which the underlying exception will be raised.
    use_sslTr-   Furi)	get_use_insecure_sift_channelr6   _compute_channel_options
_clean_urir    secure_channel_compute_sift_interceptorsintercept_channel)	configmetadatar9   r-   credentialsoptionsapi_urichannelinterceptorss	            r5   use_sift_channelrI   6   s     jjD)Gzz"4e<)&(;;%&67K&v.G0G!!';@G-fh?L!!'9L99r   c           	         | j                  dd      }| j                  dd      }|st        | |      S t        j                  t	        | d   |      t        |      t        |       t        | |            S )z
    Like `use_sift_channel` but returns a channel meant to be used within the context
    of an async runtime when asynchonous I/O is required.
    r9   Tr-   Fr:   )targetrD   rE   rH   )r;    _use_insecure_sift_async_channelgrpc_aior?   r>   r6   r=    _compute_sift_async_interceptors)rB   rC   r9   r-   s       r5   use_sift_async_channelrO   P   sr     jjD)Gzz"4e</AA""&-1'(89(05fhG	 r   c                    t        |       }t        | d   d      }t        j                  ||      }t	        | |      }t        j
                  |g| S )'
    FOR DEVELOPMENT PURPOSES ONLY
    r:   F)r=   r>   r    insecure_channelr@   rA   )rB   rC   rE   rF   rG   rH   s         r5   r<   r<   e   sR     'v.G.G##GW5G-fh?L!!'9L99r   c                r    t        j                  t        | d   d      t        |       t	        | |            S )rQ   r:   F)rK   rE   rH   )rM   rR   r>   r=   rN   rB   rC   s     r5   rL   rL   r   s7     $$&-/(05fhG r   c                    t        | |      gS )z,
    Initialized all interceptors here.
    )_metadata_interceptorrT   s     r5   r@   r@      s     	fh/ r   c                    t        | |      gS N)_metadata_async_interceptorrT   s     r5   rN   rN      s     	$FH5 r   c                D   ddt        j                         j                         fdt               fg}| j	                  dd      }t        |t              r,t        t        |      }|j                  t        |             |S |r|j                  t        t                     |S )z
    Initialize all [channel options](https://github.com/grpc/grpc/blob/v1.64.x/include/grpc/impl/channel_arg_names.h) here.
    )zgrpc.enable_retries   zgrpc.service_configzgrpc.secondary_user_agentenable_keepaliveT)r   defaultas_json_compute_user_agentr;   
isinstancedictr   r   extend _compute_keep_alive_channel_optsr   )optsrE   r\   rB   s       r5   r=   r=      s     	#	 3 3 5 = = ?@ 
%&9&;<G xx 2D9"D)o'787?@ N 
78PQRNr   c                    | d   }dd| fg}|r+|j                         D ]  \  }}|j                  ||f        t        |      S )z%
    Any new metadata goes here.
    apikeyauthorizationBearer )itemsappendr   rB   rC   rf   mdkeyvals         r5   rV   rV      s\     HF$x&89:B ( 	"HCIIsCj!	" r""r   c                    | d   }dd| fg}|r+|j                         D ]  \  }}|j                  ||f        t        |      S )z;
    Any new metadata goes here for unary-unary calls.
    rf   rg   rh   )ri   rj   r   rk   s         r5   rY   rY      s\     HF$x&89:B ( 	"HCIIsCj!	" $B''r   c                    d| v sd| v rt        |       }|j                  S |rd|  nd|  }t        |      }|j                  S )z
    This will automatically transform the URI to an acceptable form regardless of whether or not
    users included the scheme in the URL or included trailing slashes.
    zhttp://zhttps://)r   netloc)r:   r9   parsedfull_uri
parsed_ress        r5   r>   r>      sR     C:,&sm}}#*#'#H&x0Jr   c                 >    	 dt        d       S # t        $ r Y yw xY w)Nzsift_stack_py/sift_stack_pyzsift-stack-py)r   r    r   r5   r_   r_      s,     89:: s    	c                6    d| d   fd| d   fd| d   fd| d   fgS )	Nzgrpc.keepalive_time_mskeepalive_time_mszgrpc.keepalive_timeout_mskeepalive_timeout_msz!grpc.http2.max_pings_without_datamax_pings_without_dataz#grpc.keepalive_permit_without_callskeepalive_permit_without_callsrw   )rB   s    r5   rc   rc      sD    	!6*=#>?	$f-C&DE	,f5M.NO	.7W0XY	 r   c                  D    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   y
)r7   a  
    Config class used to instantiate a `SiftChannel` via `use_sift_channel`.
    - `uri`: The URI of Sift's gRPC API. The scheme portion of the URI i.e. `https://` should be ommitted.
    - `apikey`: User-generated API key generated via the Sift application.
    - `enable_keepalive`: Enabled by default, but can be disabled by passing in `False`. HTTP/2 keep-alive prevents connections from
    being terminated during idle periods. A custom `sift_py.grpc.keepalive.KeepaliveConfig` may also be provided.
    - `use_ssl`: INTERNAL USE. Meant to be used for local development.
    - `cert_via_openssl`: Enable this if you want to use OpenSSL to load the certificates.
    Run `pip install sift-stack-py[openssl]` to install the dependencies required to use this option.
    This works around this issue with grpc loading SSL certificates: https://github.com/grpc/grpc/issues/29682.
    Default is False.
    strr:   rf   z)NotRequired[Union[bool, KeepaliveConfig]]r\   zNotRequired[bool]r9   r-   N)__name__
__module____qualname____doc____annotations__rw   r   r5   r7   r7      s%     
HK??''r   )r-   boolreturnzgrpc.ChannelCredentialsrX   )rB   r7   rC   Optional[Dict[str, Any]]r   r   )rB   r7   rC   r   r   r   )rB   r7   rC   r   r   zList[ClientInterceptor])rB   r7   rC   r   r   z List[grpc_aio.ClientInterceptor])rd   r7   r   zList[Tuple[str, Any]])rB   r7   rC   r   r   r   )rB   r7   rC   r   r   r   )r:   r~   r9   r   r   r~   )r   r~   )rB   r   r   zList[Tuple[str, int]])9r   
__future__r   importlib.metadatar   r   typingr   r   r   r	   r
   r   r   r   urllib.parser   r   r    grpc.aioaiorM   typing_extensionsr   r   %sift_py.grpc._async_interceptors.baser   )sift_py.grpc._async_interceptors.metadatar   sift_py.grpc._interceptors.baser   #sift_py.grpc._interceptors.metadatar   r   sift_py.grpc._retryr   sift_py.grpc.keepaliver   r   Channelr   r   r   r6   rI   rO   r<   rL   r@   rN   r=   rV   rY   r>   r_   rc   r7   rw   r   r5   <module>r      s   # < K K K .   4 H N = M + LY %&.. ) .6 EI::)A::6 EI)A, EI
:
:)A
:
: EI

)A

 EI)A EI)A%0 EI##)A##" EI(()A(( (	 (r   