mirror of
https://github.com/snltty/linker.git
synced 2025-09-26 21:15:57 +08:00
185
This commit is contained in:
@@ -60,9 +60,11 @@ namespace linker.messenger.channel
|
||||
connections.AddOrUpdate(connection.RemoteMachineId, connection, (a, b) => connection);
|
||||
}
|
||||
Version.Increment();
|
||||
|
||||
Connected(connection);
|
||||
|
||||
pcpTransfer.AddConnection(connection);
|
||||
|
||||
pcpTransfer.AddConnection(connection);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,69 +0,0 @@
|
||||
using linker.libs;
|
||||
using linker.messenger.decenter;
|
||||
using linker.messenger.signin;
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace linker.messenger.pcp
|
||||
{
|
||||
public sealed class PcpDecenter : IDecenter
|
||||
{
|
||||
public string Name => "pcp";
|
||||
public VersionManager PushVersion { get; } = new VersionManager();
|
||||
public VersionManager DataVersion { get; } = new VersionManager();
|
||||
|
||||
private ConcurrentDictionary<string, List<string>> history = new ConcurrentDictionary<string, List<string>>();
|
||||
private readonly SignInClientState signInClientState;
|
||||
private readonly ISignInClientStore signInClientStore;
|
||||
private readonly IPcpStore pcpStore;
|
||||
private readonly ISerializer serializer;
|
||||
public PcpDecenter( SignInClientState signInClientState, ISignInClientStore signInClientStore, IPcpStore pcpStore, ISerializer serializer)
|
||||
{
|
||||
this.signInClientState = signInClientState;
|
||||
this.signInClientStore = signInClientStore;
|
||||
this.pcpStore = pcpStore;
|
||||
this.serializer = serializer;
|
||||
|
||||
signInClientState.OnSignInSuccess += (times) => PushVersion.Increment();
|
||||
}
|
||||
|
||||
public List<string> GetNodes(string fromMachineId, string toMachineId)
|
||||
{
|
||||
if (history.TryGetValue(fromMachineId, out List<string> from) && history.TryGetValue(toMachineId, out List<string> to))
|
||||
{
|
||||
|
||||
}
|
||||
return new List<string>();
|
||||
}
|
||||
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return serializer.Serialize(new HistoryDecenterInfo { MachineId = signInClientStore.Id, List = pcpStore.PcpHistory.History });
|
||||
}
|
||||
public void AddData(Memory<byte> data)
|
||||
{
|
||||
HistoryDecenterInfo historyDecenterInfo = serializer.Deserialize<HistoryDecenterInfo>(data.Span);
|
||||
history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List);
|
||||
}
|
||||
public void AddData(List<ReadOnlyMemory<byte>> data)
|
||||
{
|
||||
List<HistoryDecenterInfo> list = data.Select(c => serializer.Deserialize<HistoryDecenterInfo>(c.Span)).ToList();
|
||||
foreach (var historyDecenterInfo in list)
|
||||
{
|
||||
history.AddOrUpdate(historyDecenterInfo.MachineId, historyDecenterInfo.List, (a, b) => historyDecenterInfo.List);
|
||||
}
|
||||
}
|
||||
public void ClearData()
|
||||
{
|
||||
history.Clear();
|
||||
}
|
||||
public void ProcData()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public sealed partial class HistoryDecenterInfo
|
||||
{
|
||||
public string MachineId { get; set; }
|
||||
public List<string> List { get; set; }
|
||||
}
|
||||
}
|
@@ -9,11 +9,15 @@ namespace linker.messenger.pcp
|
||||
{
|
||||
private readonly TunnelTransfer tunnel;
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly ISerializer serializer;
|
||||
private readonly IPcpStore pcpStore;
|
||||
|
||||
public PcpClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender)
|
||||
public PcpClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender, ISerializer serializer, IPcpStore pcpStore)
|
||||
{
|
||||
this.tunnel = tunnel;
|
||||
this.messengerSender = messengerSender;
|
||||
this.serializer = serializer;
|
||||
this.pcpStore = pcpStore;
|
||||
}
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.Begin)]
|
||||
@@ -22,8 +26,6 @@ namespace linker.messenger.pcp
|
||||
connection.Write(Helper.TrueArray);
|
||||
}
|
||||
|
||||
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.Fail)]
|
||||
public void Fail(IConnection connection)
|
||||
{
|
||||
@@ -33,6 +35,12 @@ namespace linker.messenger.pcp
|
||||
public void Success(IConnection connection)
|
||||
{
|
||||
}
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.Nodes)]
|
||||
public void Nodes(IConnection connection)
|
||||
{
|
||||
connection.Write(serializer.Serialize(pcpStore.PcpHistory.History));
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PcpServerMessenger : IMessenger
|
||||
@@ -102,6 +110,33 @@ namespace linker.messenger.pcp
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.NodesForward)]
|
||||
public void NodesForward(IConnection connection)
|
||||
{
|
||||
string machineid = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (signCaching.TryGet(connection.Id, machineid, out SignCacheInfo from, out SignCacheInfo to))
|
||||
{
|
||||
uint requestid = connection.ReceiveRequestWrap.RequestId;
|
||||
_ = messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = to.Connection,
|
||||
MessengerId = (ushort)PcpMessengerIds.Nodes,
|
||||
}).ContinueWith(async (result) =>
|
||||
{
|
||||
if (result.Result.Code == MessageResponeCodes.OK && result.Result.Data.Length > 0)
|
||||
{
|
||||
await messengerSender.ReplyOnly(new MessageResponseWrap
|
||||
{
|
||||
Connection = connection,
|
||||
Payload = result.Result.Data,
|
||||
RequestId = requestid,
|
||||
}, (ushort)PcpMessengerIds.NodesForward).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -13,6 +13,9 @@
|
||||
Success = 3105,
|
||||
SuccessForward = 3106,
|
||||
|
||||
Nodes = 3107,
|
||||
NodesForward = 3108,
|
||||
|
||||
None = 3199
|
||||
}
|
||||
}
|
||||
|
@@ -100,6 +100,7 @@ namespace linker.messenger.pcp
|
||||
|
||||
public void AddConnection(ITunnelConnection connection)
|
||||
{
|
||||
if (connection.Type != TunnelType.P2P) return;
|
||||
pcpStore.AddHistory(connection);
|
||||
}
|
||||
|
||||
|
@@ -60,7 +60,7 @@ namespace linker.messenger.relay
|
||||
public async Task SyncDefault(ApiControllerParamsInfo param)
|
||||
{
|
||||
SyncInfo info = param.Content.DeJson<SyncInfo>();
|
||||
await syncTreansfer.Sync("RelayDefault", info.Ids, serializer.Serialize(info.Data)).ConfigureAwait(false);
|
||||
await syncTreansfer.Sync("RelayDefault", info.Ids, serializer.Serialize(new KeyValuePair<string, TunnelProtocolType>(info.Data.Key, info.Data.Value))).ConfigureAwait(false);
|
||||
if (info.Ids.Length == 0 || info.Ids.Contains(signInClientStore.Id))
|
||||
{
|
||||
relayClientStore.SetDefaultNodeId(info.Data.Key);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
v1.8.5
|
||||
2025-06-23 14:37:11
|
||||
2025-06-23 15:14:21
|
||||
1. 一些累计更新
|
||||
2. 备用信标服务器
|
||||
3. 设置默认中继节点
|
||||
|
Reference in New Issue
Block a user