mirror of
https://github.com/snltty/linker.git
synced 2025-12-18 09:26:44 +08:00
119 lines
4.7 KiB
C#
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; }
|
|
}
|
|
|
|
}
|