using linker.server; using linker.libs.api; using linker.plugins.tuntap.vea; using linker.client; using linker.plugins.tuntap.messenger; using MemoryPack; using linker.libs.extends; using linker.client.capi; using System.Collections.Concurrent; using linker.config; using linker.plugins.forward.proxy; using linker.tunnel.connection; using linker.plugins.tuntap.proxy; namespace linker.plugins.tuntap { public sealed class TuntapClientApiController : IApiClientController { private readonly MessengerSender messengerSender; private readonly TuntapTransfer tuntapTransfer; private readonly ClientSignInState clientSignInState; private readonly ConfigWrap config; private readonly TuntapProxy tuntapProxy; public TuntapClientApiController(MessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, ConfigWrap config, TuntapProxy tuntapProxy) { this.messengerSender = messengerSender; this.tuntapTransfer = tuntapTransfer; this.clientSignInState = clientSignInState; this.config = config; this.tuntapProxy = tuntapProxy; } public ConcurrentDictionary Connections(ApiControllerParamsInfo param) { return tuntapProxy.GetConnections(); } public void RemoveConnection(ApiControllerParamsInfo param) { tuntapProxy.RemoveConnection(param.Content); } /// /// 获取所有客户端的网卡信息 /// /// /// public TuntabListInfo Get(ApiControllerParamsInfo param) { uint hashCode = uint.Parse(param.Content); uint _hashCode = tuntapTransfer.InfosVersion; if (_hashCode != hashCode) { return new TuntabListInfo { List = tuntapTransfer.Infos, HashCode = _hashCode }; } return new TuntabListInfo { HashCode = _hashCode }; } /// /// 刷新网卡信息 /// /// public void Refresh(ApiControllerParamsInfo param) { tuntapTransfer.Refresh(); } /// /// 运行网卡 /// /// /// public async Task Run(ApiControllerParamsInfo param) { //运行自己的 if (param.Content == config.Data.Client.Id) { tuntapTransfer.Stop(); tuntapTransfer.Run(); } else { //运行别人的 await messengerSender.SendOnly(new MessageRequestWrap { Connection = clientSignInState.Connection, MessengerId = (ushort)TuntapMessengerIds.RunForward, Payload = MemoryPackSerializer.Serialize(param.Content) }).ConfigureAwait(false); } return true; } /// /// 停止网卡 /// /// /// public async Task Stop(ApiControllerParamsInfo param) { //停止自己的 if (param.Content == config.Data.Client.Id) { tuntapTransfer.Stop(); } else { //停止别人的 await messengerSender.SendOnly(new MessageRequestWrap { Connection = clientSignInState.Connection, MessengerId = (ushort)TuntapMessengerIds.StopForward, Payload = MemoryPackSerializer.Serialize(param.Content) }).ConfigureAwait(false); } return true; } //更新网卡信息 public async Task Update(ApiControllerParamsInfo param) { TuntapInfo info = param.Content.DeJson(); //更新自己的 if (info.MachineId == config.Data.Client.Id) { tuntapTransfer.OnUpdate(info); } else { //更新别人的 await messengerSender.SendOnly(new MessageRequestWrap { Connection = clientSignInState.Connection, MessengerId = (ushort)TuntapMessengerIds.UpdateForward, Payload = MemoryPackSerializer.Serialize(info) }).ConfigureAwait(false); } return true; } public sealed class TuntabListInfo { public ConcurrentDictionary List { get; set; } public uint HashCode { get; set; } } } }