//
// 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 = "TxEventProto";

import "GrpcCommon.proto";

service TxEventService {
  rpc OnConnected (GrpcServiceConfig) returns (stream GrpcCompensateCommand) {
  }
  rpc OnTxEvent (GrpcTxEvent) returns (GrpcAck) {}
  rpc OnDisconnected (GrpcServiceConfig) returns (GrpcAck) {
  }
  rpc onGetServerMeta(GrpcServiceConfig) returns (ServerMeta) {}
}

message GrpcTxEvent {
  int64 timestamp = 1;
  string globalTxId = 2;
  string localTxId = 3;
  string parentTxId = 4;
  string type = 5;
  string compensationMethod = 6;
  bytes payloads = 7;
  string serviceName = 8;
  string instanceId = 9;
  int32 timeout = 10;
  int32 retries = 11;
  string retryMethod = 12;
}

message GrpcCompensateCommand {
  string globalTxId = 1;
  string localTxId = 2;
  string parentTxId = 3;
  string compensationMethod = 4;
  bytes payloads = 5;
}

