from typing import Optional from dataclasses import dataclass from frostfs_sdk.client.utils.session_cache import SessionToken from frostfs_sdk.cryptography.signer import Signer from frostfs_sdk.models.mappers.session_mapper import SessionMapper from frostfs_sdk.models.mappers.owner_id_mapper import OwnerIdMapper from frostfs_sdk.client.models.client_environment import ClientEnvironment from frostfs_sdk.client.services.context_accessor import ContextAccessor from frostfs_sdk.client.utils.request_constructor import RequestConstructor from frostfs_sdk.client.parameters.call_context_param import CallContextParam from frostfs_sdk.client.parameters.create_session_param import CreateSessionParam from frostfs_sdk.protos.models.session import service_pb2_grpc as service_pb2_grpc_session from frostfs_sdk.protos.models.session import service_pb2 as service_pb2_session from frostfs_sdk.protos.models.session import types_pb2 as types_pb2_session class SessionClient(ContextAccessor): def __init__(self, client_environment: ClientEnvironment): super().__init__(client_environment) self.session_stub = service_pb2_grpc_session.SessionServiceStub(client_environment.channel) def create_session(self, param: CreateSessionParam, ctx: CallContextParam) -> SessionToken: body = service_pb2_session.CreateRequest.Body( owner_id=OwnerIdMapper.to_grpc_message(self.get_context.owner_id), expiration=param.expiration ) request = service_pb2_session.CreateRequest( body=body ) RequestConstructor.add_meta_header(request, None, None) signed_request = Signer.sign_message(self.get_context.ecdsa.private_key, request) response: service_pb2_session.CreateResponse = self.session_stub.Create(request) session_token_grpc = types_pb2_session.SessionToken(response.body) token = SessionMapper.serialize(session_token_grpc) return SessionToken(token=token)