# Path: nanoservice/reqrep.py
# class Requester(Endpoint):
#     """ A requester client """
# 
#     # pylint: disable=too-many-arguments
#     # pylint: disable=no-member
#     def __init__(self, address, encoder=None, authenticator=None,
#                  socket=None, bind=False, timeouts=(None, None)):
# 
#         # Defaults
#         socket = socket or nanomsg.Socket(nanomsg.REQ)
#         encoder = encoder or MsgPackEncoder()
# 
#         super(Requester, self).__init__(
#             socket, address, bind, encoder, authenticator, timeouts)
# 
#     @classmethod
#     def build_payload(cls, method, args):
#         """ Build the payload to be sent to a `Responder` """
#         ref = str(uuid.uuid4())
#         return (method, args, ref)
# 
#     # pylint: disable=logging-format-interpolation
#     def call(self, method, *args):
#         """ Make a call to a `Responder` and return the result """
# 
#         payload = self.build_payload(method, args)
#         logging.debug('* Client will send payload: {}'.format(payload))
#         self.send(payload)
# 
#         res = self.receive()
#         assert payload[2] == res['ref']
#         return res['result'], res['error']
# 
# Path: nanoservice/crypto.py
# class Authenticator(object):
#     """ This object is used to authenticate messages """
# 
#     def __init__(self, secret, digestmod=None):
#         assert secret
#         self.secret = secret.encode('utf-8')
#         self.digestmod = digestmod or hashlib.sha256
#         self.sig_size = self.digestmod().digest_size * 2
#         self._hmac = hmac.new(self.secret, digestmod=self.digestmod)
# 
#     def sign(self, encoded):
#         """ Return authentication signature of encoded bytes """
#         signature = self._hmac.copy()
#         signature.update(encoded)
#         return signature.hexdigest().encode('utf-8')
# 
#     def signed(self, encoded):
#         """ Sign encoded bytes and append signature """
#         signature = self.sign(encoded)
#         return encoded + signature
# 
#     def unsigned(self, encoded):
#         """ Remove signature and return just the message """
#         message, _ = self.split(encoded)
#         return message
# 
#     def split(self, encoded):
#         """ Split into signature and message """
#         maxlen = len(encoded) - self.sig_size
#         message = encoded[:maxlen]
#         signature = encoded[-self.sig_size:]
#         return message, signature
# 
#     def auth(self, encoded):
#         """ Validate integrity of encoded bytes """
#         message, signature = self.split(encoded)
#         computed = self.sign(message)
#         if not hmac.compare_digest(signature, computed):
#             raise AuthenticatorInvalidSignature


import time
import hashlib
from nanoservice import Requester
from nanoservice import Authenticator



def main():
    c = Requester(
        'ipc:///tmp/auth-example-service.sock',
        authenticator=Authenticator('my-super-secret', hashlib.sha256)
    )

    n = 100
    started = time.time()
    for i in range(n):
        _, err = c.call('generate_uuid')
        assert err is None

    duration = time.time() - started

# Path: nanoservice/reqrep.py
# class Requester(Endpoint):
#     """ A requester client """
# 
#     # pylint: disable=too-many-arguments
#     # pylint: disable=no-member
#     def __init__(self, address, encoder=None, authenticator=None,
#                  socket=None, bind=False, timeouts=(None, None)):
# 
#         # Defaults
#         socket = socket or nanomsg.Socket(nanomsg.REQ)
#         encoder = encoder or MsgPackEncoder()
# 
#         super(Requester, self).__init__(
#             socket, address, bind, encoder, authenticator, timeouts)
# 
#     @classmethod
#     def build_payload(cls, method, args):
#         """ Build the payload to be sent to a `Responder` """
#         ref = str(uuid.uuid4())
#         return (method, args, ref)
# 
#     # pylint: disable=logging-format-interpolation
#     def call(self, method, *args):
#         """ Make a call to a `Responder` and return the result """
# 
#         payload = self.build_payload(method, args)
#         logging.debug('* Client will send payload: {}'.format(payload))
#         self.send(payload)
# 
#         res = self.receive()
#         assert payload[2] == res['ref']
#         return res['result'], res['error']
# 
# Path: nanoservice/crypto.py
# class Authenticator(object):
#     """ This object is used to authenticate messages """
# 
#     def __init__(self, secret, digestmod=None):
#         assert secret
#         self.secret = secret.encode('utf-8')
#         self.digestmod = digestmod or hashlib.sha256
#         self.sig_size = self.digestmod().digest_size * 2
#         self._hmac = hmac.new(self.secret, digestmod=self.digestmod)
# 
#     def sign(self, encoded):
#         """ Return authentication signature of encoded bytes """
#         signature = self._hmac.copy()
#         signature.update(encoded)
#         return signature.hexdigest().encode('utf-8')
# 
#     def signed(self, encoded):
#         """ Sign encoded bytes and append signature """
#         signature = self.sign(encoded)
#         return encoded + signature
# 
#     def unsigned(self, encoded):
#         """ Remove signature and return just the message """
#         message, _ = self.split(encoded)
#         return message
# 
#     def split(self, encoded):
#         """ Split into signature and message """
#         maxlen = len(encoded) - self.sig_size
#         message = encoded[:maxlen]
#         signature = encoded[-self.sig_size:]
#         return message, signature
# 
#     def auth(self, encoded):
#         """ Validate integrity of encoded bytes """
#         message, signature = self.split(encoded)
#         computed = self.sign(message)
#         if not hmac.compare_digest(signature, computed):
#             raise AuthenticatorInvalidSignature


# Path: examples/req_rep/auth_client.py
import time
import hashlib
from nanoservice import Requester
from nanoservice import Authenticator




def main():
    c = Requester(
        'ipc:///tmp/auth-example-service.sock',
        authenticator=Authenticator('my-super-secret', hashlib.sha256)
    )

    n = 100
    started = time.time()
    for i in range(n):
        _, err = c.call('generate_uuid')
        assert err is None

    duration = time.time() - started

    print(