//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

option java_multiple_files = true;
option java_package = "org.apache.servicecomb.pack.contract.grpc";
option java_outer_classname = "TccEventProto";

import "GrpcCommon.proto";

service TccEventService {
  rpc OnConnected (GrpcServiceConfig) returns (stream GrpcTccCoordinateCommand) {
  }
  rpc OnParticipationStarted(GrpcParticipationStartedEvent) returns (GrpcAck) {}
  rpc OnParticipationEnded(GrpcParticipationEndedEvent) returns (GrpcAck) {}
  rpc OnTccTransactionStarted (GrpcTccTransactionStartedEvent) returns (GrpcAck) {}
  rpc OnTccTransactionEnded (GrpcTccTransactionEndedEvent) returns (GrpcAck) {}
  rpc OnTccCoordinated(GrpcTccCoordinatedEvent) returns(GrpcAck) {}
  rpc OnDisconnected (GrpcServiceConfig) returns (GrpcAck) {
  }
}

message GrpcTccTransactionStartedEvent {
  int64 timestamp = 1;
  string globalTxId = 2;
  string localTxId = 3;
  string parentTxId = 4;
  string serviceName = 5;
  string instanceId = 6;
}

message GrpcParticipationStartedEvent {
  int64 timestamp = 1;
  string globalTxId = 2;
  string localTxId = 3;
  string parentTxId = 4;
  string serviceName = 5;
  string instanceId = 6;
  string confirmMethod = 7;
  string cancelMethod = 8;
}

message GrpcParticipationEndedEvent {
  int64 timestamp = 1;
  string globalTxId = 2;
  string localTxId = 3;
  string parentTxId = 4;
  string serviceName = 5;
  string instanceId = 6;
  string confirmMethod = 7;
  string cancelMethod = 8;
  string status = 9;
}

message GrpcTccTransactionEndedEvent {
  int64 timestamp = 1;
  string globalTxId = 2;
  string localTxId = 3;
  string parentTxId = 4;
  string serviceName = 5;
  string instanceId = 6;
  string status = 7;
}

message GrpcTccCoordinatedEvent {
  int64 timestamp = 1;
  string globalTxId = 2;
  string localTxId = 3;
  string parentTxId = 4;
  string serviceName = 5;
  string instanceId = 6;
  string methodName = 7;
  string status = 8;
}

message GrpcTccCoordinateCommand {
  string globalTxId = 1;
  string localTxId = 2;
  string parentTxId = 3;
  string serviceName = 4;
  string method = 5;
}

