Add 2023 R2 gRPC transport (RemoteGrpc) reusing native byte payloads
Stands up HistorianTransport.RemoteGrpc end-to-end for the read path, built on the recovered 2023 R2 gRPC contract (gRPC-Web/HTTP-1.1, port 32565, gzip). The opaque protobuf `bytes` fields carry the SAME native binary payloads as the 2020 WCF/MDAS path, so the proven serializers and parsers are reused unchanged. - Grpc/Protos/*.proto: 6 protoc-validated contracts recovered from embedded FileDescriptors (authoritative, not guessed). - Grpc/HistorianGrpcChannelFactory: GrpcWebHandler/HTTP-1.1 channel, ResolvePort/ResolveAddress, optional TLS + gzip. - Grpc/HistorianGrpcReadOrchestrator: mirrors the WCF read chain over gRPC; auth uses HistoryService.ExchangeKey (the gRPC ValCl op). - Wcf/HistorianNativeHandshake: transport-agnostic Open2 request builder + SSPI/Negotiate token loop + response decode, shared by WCF and gRPC. - Op map (2020 -> gRPC): ValCl->ExchangeKey, Open2->OpenConnection, StartQuery2->StartQuery, GetNextQueryResultBuffer2->GetNextQueryResultBuffer. - HistorianClientOptions: DefaultGrpcPort=32565, GrpcUseTls. - csproj: Google.Protobuf, Grpc.Net.Client(.Web), Grpc.Tools codegen. Not yet live-verified against a 2023 R2 server: ExchangeKey is the first thing to revisit if a live server rejects the handshake; the inner byte payloads are the proven 2020 protocol. Gated live test via HISTORIAN_GRPC_HOST. 188 unit tests green; build clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,417 @@
|
||||
// Recovered from StorageService.proto (AVEVA Historian SDK 2023 R2, Archestra.Grpc.Contract).
|
||||
// Reconstructed from the embedded protobuf FileDescriptor; field numbers are authoritative.
|
||||
syntax = "proto3";
|
||||
|
||||
import "Status.proto";
|
||||
|
||||
option csharp_namespace = "ArchestrA.Grpc.Contract.Storage";
|
||||
|
||||
message GetInterfaceVersionRequest {
|
||||
}
|
||||
|
||||
message GetInterfaceVersionResponse {
|
||||
uint32 uiError = 1;
|
||||
uint32 uiVersion = 2;
|
||||
}
|
||||
|
||||
message OpenStorageConnectionRequest {
|
||||
string HostName = 1;
|
||||
string EnginePath = 2;
|
||||
uint32 FreeDiskSpace = 3;
|
||||
string ProcessName = 4;
|
||||
uint32 ProcessId = 5;
|
||||
string UserName = 6;
|
||||
bytes Password = 7;
|
||||
uint32 PwdLength = 8;
|
||||
uint32 ClientType = 9;
|
||||
uint32 ClientVersion = 10;
|
||||
uint32 ConnectionMode = 11;
|
||||
uint32 ConnectionTimeout = 12;
|
||||
string StorageSessionId = 13;
|
||||
}
|
||||
|
||||
message OpenStorageConnectionResponse {
|
||||
.Status status = 1;
|
||||
string StorageSessionId = 2;
|
||||
uint32 Handle = 3;
|
||||
uint64 ConnectionTime = 4;
|
||||
uint32 ServerStatus = 5;
|
||||
}
|
||||
|
||||
message CloseStorageConnectionRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message CloseStorageConnectionResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message PingRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message PingResponse {
|
||||
.Status status = 1;
|
||||
uint32 OutByteCount = 2;
|
||||
bytes OutBuff = 3;
|
||||
}
|
||||
|
||||
message AddTagsRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 ElementCount = 2;
|
||||
uint32 InByteCount = 3;
|
||||
bytes InBuff = 4;
|
||||
}
|
||||
|
||||
message AddTagsResponse {
|
||||
.Status status = 1;
|
||||
uint32 OutByteCount = 2;
|
||||
bytes OutBuff = 3;
|
||||
}
|
||||
|
||||
message RegisterTagsRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 ElementCount = 2;
|
||||
uint32 InByteCount = 3;
|
||||
bytes InBuff = 4;
|
||||
}
|
||||
|
||||
message RegisterTagsResponse {
|
||||
.Status status = 1;
|
||||
uint32 OutByteCount = 2;
|
||||
bytes OutBuff = 3;
|
||||
}
|
||||
|
||||
message AddStreamValuesRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 Size = 2;
|
||||
bytes Buffer = 3;
|
||||
}
|
||||
|
||||
message AddStreamValuesResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message GetTagIdsRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 Sequence = 2;
|
||||
}
|
||||
|
||||
message GetTagIdsResponse {
|
||||
.Status status = 1;
|
||||
uint32 Sequence = 2;
|
||||
uint32 Size = 3;
|
||||
bytes TagIds = 4;
|
||||
}
|
||||
|
||||
message GetTagsRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 TagIdsSize = 2;
|
||||
bytes TagIds = 3;
|
||||
uint32 Sequence = 4;
|
||||
}
|
||||
|
||||
message GetTagsResponse {
|
||||
.Status status = 1;
|
||||
uint32 Sequence = 2;
|
||||
uint32 TagInfosSize = 3;
|
||||
bytes TagInfos = 4;
|
||||
}
|
||||
|
||||
message FlushMetadataRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 TagIdsSize = 2;
|
||||
bytes TagIds = 3;
|
||||
}
|
||||
|
||||
message FlushMetadataResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message FlushDataRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message FlushDataResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message LoadBlocksRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 Sequence = 2;
|
||||
}
|
||||
|
||||
message LoadBlocksResponse {
|
||||
.Status status = 1;
|
||||
uint32 Sequence = 2;
|
||||
uint32 HistoryBlockSize = 3;
|
||||
bytes HistoryBlocks = 4;
|
||||
}
|
||||
|
||||
message GetSnapshotsRequest {
|
||||
uint32 Handle = 1;
|
||||
uint64 BlockStartTime = 2;
|
||||
uint32 Sequence = 3;
|
||||
}
|
||||
|
||||
message GetSnapshotsResponse {
|
||||
.Status status = 1;
|
||||
uint32 Sequence = 2;
|
||||
uint32 SnapshotSize = 3;
|
||||
bytes Snapshot = 4;
|
||||
}
|
||||
|
||||
message StartQuerySnapshotRequest {
|
||||
uint32 Handle = 1;
|
||||
uint64 BlockStartTime = 2;
|
||||
uint32 SnapshotInfoSize = 3;
|
||||
bytes SnapshotInfo = 4;
|
||||
uint32 SnapshotQueryId = 5;
|
||||
}
|
||||
|
||||
message StartQuerySnapshotResponse {
|
||||
.Status status = 1;
|
||||
uint32 SnapshotQueryId = 2;
|
||||
}
|
||||
|
||||
message NextQuerySnapshotRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 SnapshotQueryId = 2;
|
||||
uint32 Sequence = 3;
|
||||
}
|
||||
|
||||
message NextQuerySnapshotResponse {
|
||||
.Status status = 1;
|
||||
uint32 Sequence = 2;
|
||||
uint32 SnapshotSize = 3;
|
||||
bytes Snapshot = 4;
|
||||
}
|
||||
|
||||
message EndSnapshotRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 SnapshotQueryId = 2;
|
||||
uint64 BlockStartTime = 3;
|
||||
uint32 SnapshotInfoSize = 4;
|
||||
bytes SnapshotInfo = 5;
|
||||
bool IsDeleteSnapshot = 6;
|
||||
}
|
||||
|
||||
message EndSnapshotResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message StopRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message StopResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message ClearTagidPairsRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message ClearTagidPairsResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message AddTagidPairsRequest {
|
||||
uint32 Handle = 1;
|
||||
uint32 ElementCount = 2;
|
||||
uint32 InByteCount = 3;
|
||||
bytes InBuff = 4;
|
||||
}
|
||||
|
||||
message AddTagidPairsResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message GetSFParameterRequest {
|
||||
uint32 Handle = 1;
|
||||
string ParameterName = 2;
|
||||
}
|
||||
|
||||
message GetSFParameterResponse {
|
||||
.Status status = 1;
|
||||
string ParamaterValue = 2;
|
||||
}
|
||||
|
||||
message SetSFParameterRequest {
|
||||
uint32 Handle = 1;
|
||||
string ParamaterName = 2;
|
||||
string ParamaterValue = 3;
|
||||
}
|
||||
|
||||
message SetSFParameterResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message SendSnapshotBeginRequest {
|
||||
uint32 Handle = 1;
|
||||
uint64 TotalSize = 2;
|
||||
uint64 StartTime = 3;
|
||||
uint64 EndTime = 4;
|
||||
string StorageSessionId = 5;
|
||||
}
|
||||
|
||||
message SendSnapshotBeginResponse {
|
||||
.Status status = 1;
|
||||
string StorageSessionId = 2;
|
||||
uint32 QueryId = 3;
|
||||
}
|
||||
|
||||
message SendSnapshotEndRequest {
|
||||
uint32 Handle = 1;
|
||||
string StorageSessionId = 2;
|
||||
uint32 QueryId = 3;
|
||||
uint32 TimeRangeSize = 4;
|
||||
bytes TimeRangeBytes = 5;
|
||||
}
|
||||
|
||||
message SendSnapshotEndResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message SendSnapshotRequest {
|
||||
uint32 Handle = 1;
|
||||
string StorageSessionId = 2;
|
||||
uint32 QueryId = 3;
|
||||
uint32 Size = 4;
|
||||
uint64 SnapShotChunkOffset = 5;
|
||||
bytes Buffer = 6;
|
||||
}
|
||||
|
||||
message SendSnapshotResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message DeleteSnapshotRequest {
|
||||
uint32 Handle = 1;
|
||||
uint64 StartTime = 2;
|
||||
uint32 SnapshotInfoSize = 3;
|
||||
bytes SnapshotInfo = 4;
|
||||
}
|
||||
|
||||
message DeleteSnapshotResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message AddStreamValues2Request {
|
||||
uint32 Handle = 1;
|
||||
string ShardId = 2;
|
||||
bytes Buffer = 3;
|
||||
}
|
||||
|
||||
message AddStreamValues2Response {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message ClearShardTagidsRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message ClearShardTagidsResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message AddShardTagidsRequest {
|
||||
uint32 Handle = 1;
|
||||
bytes Buffer = 2;
|
||||
}
|
||||
|
||||
message AddShardTagidsResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message SplitUnknownShardsRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message SplitUnknownShardsResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message GetRemainingSnapshotsSizeRequest {
|
||||
uint32 Handle = 1;
|
||||
}
|
||||
|
||||
message GetRemainingSnapshotsSizeResponse {
|
||||
.Status status = 1;
|
||||
uint64 SnapshotSize = 2;
|
||||
}
|
||||
|
||||
message DeleteTagsRequest {
|
||||
uint32 Handle = 1;
|
||||
bytes Buffer = 2;
|
||||
}
|
||||
|
||||
message DeleteTagsResponse {
|
||||
.Status status = 1;
|
||||
}
|
||||
|
||||
message OpenStorageConnection2Request {
|
||||
bytes InParameters = 1;
|
||||
}
|
||||
|
||||
message OpenStorageConnection2Response {
|
||||
.Status status = 1;
|
||||
bytes OutParmaters = 2;
|
||||
}
|
||||
|
||||
message ValidateClientCredentialRequest {
|
||||
string Handle = 1;
|
||||
bytes InBuff = 2;
|
||||
}
|
||||
|
||||
message ValidateClientCredentialResponse {
|
||||
.Status status = 1;
|
||||
bytes OutBuff = 2;
|
||||
}
|
||||
|
||||
message GetInfoRequest {
|
||||
string Request = 1;
|
||||
}
|
||||
|
||||
message GetInfoResponse {
|
||||
.Status status = 1;
|
||||
bytes info = 2;
|
||||
}
|
||||
|
||||
service StorageService {
|
||||
rpc GetInterfaceVersion (.GetInterfaceVersionRequest) returns (.GetInterfaceVersionResponse);
|
||||
rpc OpenStorageConnection (.OpenStorageConnectionRequest) returns (.OpenStorageConnectionResponse);
|
||||
rpc CloseStorageConnection (.CloseStorageConnectionRequest) returns (.CloseStorageConnectionResponse);
|
||||
rpc Ping (.PingRequest) returns (.PingResponse);
|
||||
rpc AddTags (.AddTagsRequest) returns (.AddTagsResponse);
|
||||
rpc RegisterTags (.RegisterTagsRequest) returns (.RegisterTagsResponse);
|
||||
rpc AddStreamValues (.AddStreamValuesRequest) returns (.AddStreamValuesResponse);
|
||||
rpc GetTagIds (.GetTagIdsRequest) returns (.GetTagIdsResponse);
|
||||
rpc GetTags (.GetTagsRequest) returns (.GetTagsResponse);
|
||||
rpc FlushMetadata (.FlushMetadataRequest) returns (.FlushMetadataResponse);
|
||||
rpc FlushData (.FlushDataRequest) returns (.FlushDataResponse);
|
||||
rpc LoadBlocks (.LoadBlocksRequest) returns (.LoadBlocksResponse);
|
||||
rpc GetSnapshots (.GetSnapshotsRequest) returns (.GetSnapshotsResponse);
|
||||
rpc StartQuerySnapshot (.StartQuerySnapshotRequest) returns (.StartQuerySnapshotResponse);
|
||||
rpc NextQuerySnapshot (.NextQuerySnapshotRequest) returns (.NextQuerySnapshotResponse);
|
||||
rpc EndSnapshot (.EndSnapshotRequest) returns (.EndSnapshotResponse);
|
||||
rpc Stop (.StopRequest) returns (.StopResponse);
|
||||
rpc ClearTagidPairs (.ClearTagidPairsRequest) returns (.ClearTagidPairsResponse);
|
||||
rpc AddTagidPairs (.AddTagidPairsRequest) returns (.AddTagidPairsResponse);
|
||||
rpc GetSFParameter (.GetSFParameterRequest) returns (.GetSFParameterResponse);
|
||||
rpc SetSFParameter (.SetSFParameterRequest) returns (.SetSFParameterResponse);
|
||||
rpc SendSnapshotBegin (.SendSnapshotBeginRequest) returns (.SendSnapshotBeginResponse);
|
||||
rpc SendSnapshotEnd (.SendSnapshotEndRequest) returns (.SendSnapshotEndResponse);
|
||||
rpc SendSnapshot (.SendSnapshotRequest) returns (.SendSnapshotResponse);
|
||||
rpc DeleteSnapshot (.DeleteSnapshotRequest) returns (.DeleteSnapshotResponse);
|
||||
rpc AddStreamValues2 (.AddStreamValues2Request) returns (.AddStreamValues2Response);
|
||||
rpc ClearShardTagids (.ClearShardTagidsRequest) returns (.ClearShardTagidsResponse);
|
||||
rpc AddShardTagids (.AddShardTagidsRequest) returns (.AddShardTagidsResponse);
|
||||
rpc SplitUnknownShards (.SplitUnknownShardsRequest) returns (.SplitUnknownShardsResponse);
|
||||
rpc GetRemainingSnapshotsSize (.GetRemainingSnapshotsSizeRequest) returns (.GetRemainingSnapshotsSizeResponse);
|
||||
rpc DeleteTags (.DeleteTagsRequest) returns (.DeleteTagsResponse);
|
||||
rpc OpenStorageConnection2 (.OpenStorageConnection2Request) returns (.OpenStorageConnection2Response);
|
||||
rpc ValidateClientCredential (.ValidateClientCredentialRequest) returns (.ValidateClientCredentialResponse);
|
||||
rpc GetInfo (.GetInfoRequest) returns (.GetInfoResponse);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user