syntax = "proto3";

package neo.fs.v2.session;

option go_package = "github.com/nspcc-dev/neofs-api-go/v2/session/grpc;session";
option csharp_namespace = "Neo.FileStorage.API.Session";

import "refs/types.proto";
import "session/types.proto";

// `SessionService` allows to establish a temporary trust relationship between
// two peer nodes and generate a `SessionToken` as the proof of trust to be
// attached in requests for further verification. Please see corresponding
// section of NeoFS Technical Specification for details.
service SessionService {
  // Opens a new session between two peers.
  rpc Create (CreateRequest) returns (CreateResponse);
}

// Information necessary for opening a session.
message CreateRequest {
  // Session creation request body
  message Body {
    // Session initiating user's or node's key derived `OwnerID`
    neo.fs.v2.refs.OwnerID owner_id = 1;
    // Session expiration `Epoch`
    uint64 expiration = 2;
  }
  // Body of create session token request message.
  Body body = 1;

  // Carries request meta information. Header data is used only to regulate
  // message transport and does not affect request execution.
  neo.fs.v2.session.RequestMetaHeader meta_header = 2;

  // Carries request verification information. This header is used to
  // authenticate the nodes of the message route and check the correctness of
  // transmission.
  neo.fs.v2.session.RequestVerificationHeader verify_header = 3;
}

// Information about the opened session.
message CreateResponse {
  // Session creation response body
  message Body {
    // Identifier of a newly created session
    bytes id = 1;

    // Public key used for session
    bytes session_key = 2;
  }

  // Body of create session token response message.
  Body body = 1;

  // Carries response meta information. Header data is used only to regulate
  // message transport and does not affect request execution.
  neo.fs.v2.session.ResponseMetaHeader meta_header = 2;

  // Carries response verification information. This header is used to
  // authenticate the nodes of the message route and check the correctness of
  // transmission.
  neo.fs.v2.session.ResponseVerificationHeader verify_header = 3;
}