Files
linker/src/linker.messenger.relay/client/RelayApiController.cs

119 lines
4.7 KiB
C#

using linker.libs;
using linker.libs.extends;
using linker.libs.web;
using linker.messenger.api;
using linker.messenger.relay.client;
using linker.messenger.relay.client.transport;
using linker.messenger.relay.messenger;
using linker.messenger.relay.server;
using linker.messenger.signin;
using linker.tunnel.connection;
using System.Collections.Concurrent;
namespace linker.messenger.relay
{
/// <summary>
/// 中继管理接口
/// </summary>
public sealed class RelayApiController : IApiController
{
private readonly RelayClientTestTransfer relayTestTransfer;
private readonly RelayClientTransfer relayTransfer;
private readonly IRelayClientStore relayClientStore;
private readonly SignInClientState signInClientState;
private readonly IMessengerSender messengerSender;
private readonly ISerializer serializer;
private readonly ISignInClientStore signInClientStore;
public RelayApiController(RelayClientTestTransfer relayTestTransfer, RelayClientTransfer relayTransfer, IRelayClientStore relayClientStore,
SignInClientState signInClientState, IMessengerSender messengerSender, ISerializer serializer, ISignInClientStore signInClientStore)
{
this.relayTestTransfer = relayTestTransfer;
this.relayTransfer = relayTransfer;
this.relayClientStore = relayClientStore;
this.signInClientState = signInClientState;
this.messengerSender = messengerSender;
this.serializer = serializer;
this.signInClientStore = signInClientStore;
}
[Access(AccessValue.Config)]
public bool SetServers(ApiControllerParamsInfo param)
{
RelayServerInfo info = param.Content.DeJson<RelayServerInfo>();
relayClientStore.SetServer(info);
return true;
}
public List<RelayServerNodeReportInfo170> Subscribe(ApiControllerParamsInfo param)
{
relayTestTransfer.Subscribe();
return relayTestTransfer.Nodes;
}
/// <summary>
/// 正在操作列表
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public ConcurrentDictionary<string, bool> Operating(ApiControllerParamsInfo param)
{
return relayTransfer.Operating;
}
/// <summary>
/// 连接
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public bool Connect(ApiControllerParamsInfo param)
{
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
if(relayConnectInfo.Protocol == TunnelProtocolType.None)
{
relayConnectInfo.Protocol = TunnelProtocolType.Tcp;
}
_ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId, relayConnectInfo.Protocol);
relayClientStore.SetDefaultNodeId(relayConnectInfo.NodeId);
relayClientStore.SetDefaultProtocol(relayConnectInfo.Protocol);
return true;
}
public async Task<bool> UpdateNode(ApiControllerParamsInfo param)
{
RelayServerNodeUpdateInfo info = param.Content.DeJson<RelayServerNodeUpdateInfo>();
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.UpdateNodeForward,
Payload = serializer.Serialize(new RelayServerNodeUpdateWrapInfo
{
Info = info,
SecretKey = relayClientStore.Server.SecretKey
})
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
public async Task<bool> CheckKey(ApiControllerParamsInfo param)
{
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)RelayMessengerIds.CheckKey,
Payload = serializer.Serialize(param.Content)
}).ConfigureAwait(false);
return resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray);
}
}
public sealed class RelayConnectInfo
{
public string FromMachineId { get; set; }
public string ToMachineId { get; set; }
public string TransactionId { get; set; }
public string NodeId { get; set; }
public TunnelProtocolType Protocol { get; set; }
}
}