syntax = "proto3";
package session;
option go_package = "github.com/nspcc-dev/neofs-proto/session";

import "session/types.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";

option (gogoproto.stable_marshaler_all) = true;


service Session {
    // Create is a method that used to open a trusted session to manipulate
    // an object. In order to put or delete object client have to obtain session
    // token with trusted node. Trusted node will modify client's object
    // (add missing headers, checksums, homomorphic hash) and sign id with
    // session key. Session is established during 4-step handshake in one gRPC stream
    //
    // - First client stream message SHOULD BE type of `CreateRequest_Init`.
    // - First server stream message SHOULD BE type of `CreateResponse_Unsigned`.
    // - Second client stream message SHOULD BE type of `CreateRequest_Signed`.
    // - Second server stream message SHOULD BE type of `CreateResponse_Result`.
    rpc Create (stream CreateRequest) returns (stream CreateResponse);
}


message CreateRequest {
    // Message should be one of
    oneof Message {
        // Init is a message to initialize session opening. Carry:
        // owner of manipulation object;
        // ID of manipulation object;
        // token lifetime bounds.
        session.Token Init = 1;
        // Signed Init message response (Unsigned) from server with user private key
        session.Token Signed = 2;
    }
}

message CreateResponse {
    oneof Message {
        // Unsigned token with token ID and session public key generated on server side
        session.Token Unsigned = 1;
        // Result is a resulting token which can be used for object placing through an trusted intermediary
        session.Token Result = 2;
    }
}