diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml
index 42b6923d..2d1bfab4 100644
--- a/.github/workflows/nuget.yml
+++ b/.github/workflows/nuget.yml
@@ -22,24 +22,60 @@ jobs:
- name: Build
run: |
dotnet build ./linker.libs -c release
- dotnet build ./linker.tunnel -c release
- dotnet build ./linker.tun -c release
dotnet build ./linker.messenger -c release
- dotnet build ./linker.messenger.relay -c release
- dotnet build ./linker.messenger.signin -c release
- dotnet build ./linker.messenger.tunnel -c release
+ dotnet build ./linker.messenger.access -c release
+ dotnet build ./linker.messenger.action -c release
+ dotnet build ./linker.messenger.api -c release
+ dotnet build ./linker.messenger.channel -c release
dotnet build ./linker.messenger.decenter -c release
+ dotnet build ./linker.messenger.entry -c release
+ dotnet build ./linker.messenger.exroute -c release
+ dotnet build ./linker.messenger.flow -c release
+ dotnet build ./linker.messenger.forward -c release
+ dotnet build ./linker.messenger.listen -c release
+ dotnet build ./linker.messenger.logger -c release
+ dotnet build ./linker.messenger.pcp -c release
+ dotnet build ./linker.messenger.relay -c release
+ dotnet build ./linker.messenger.serializer.memorypack -c release
+ dotnet build ./linker.messenger.sforward -c release
+ dotnet build ./linker.messenger.signin -c release
+ dotnet build ./linker.messenger.socks5 -c release
+ dotnet build ./linker.messenger.store.file -c release
+ dotnet build ./linker.messenger.sync -c release
+ dotnet build ./linker.messenger.tunnel -c release
+ dotnet build ./linker.messenger.tuntap -c release
+ dotnet build ./linker.messenger.updater -c release
+ dotnet build ./linker.tun -c release
+ dotnet build ./linker.tunnel -c release
- name: Pack
run: |
dotnet pack ./linker.libs -c release
- dotnet pack ./linker.tunnel -c release
- dotnet pack ./linker.tun -c release
dotnet pack ./linker.messenger -c release
- dotnet pack ./linker.messenger.relay -c release
- dotnet pack ./linker.messenger.signin -c release
- dotnet pack ./linker.messenger.tunnel -c release
+ dotnet pack ./linker.messenger.access -c release
+ dotnet pack ./linker.messenger.action -c release
+ dotnet pack ./linker.messenger.api -c release
+ dotnet pack ./linker.messenger.channel -c release
dotnet pack ./linker.messenger.decenter -c release
+ dotnet pack ./linker.messenger.entry -c release
+ dotnet pack ./linker.messenger.exroute -c release
+ dotnet pack ./linker.messenger.flow -c release
+ dotnet pack ./linker.messenger.forward -c release
+ dotnet pack ./linker.messenger.listen -c release
+ dotnet pack ./linker.messenger.logger -c release
+ dotnet pack ./linker.messenger.pcp -c release
+ dotnet pack ./linker.messenger.relay -c release
+ dotnet pack ./linker.messenger.serializer.memorypack -c release
+ dotnet pack ./linker.messenger.sforward -c release
+ dotnet pack ./linker.messenger.signin -c release
+ dotnet pack ./linker.messenger.socks5 -c release
+ dotnet pack ./linker.messenger.store.file -c release
+ dotnet pack ./linker.messenger.sync -c release
+ dotnet pack ./linker.messenger.tunnel -c release
+ dotnet pack ./linker.messenger.tuntap -c release
+ dotnet pack ./linker.messenger.updater -c release
+ dotnet pack ./linker.tun -c release
+ dotnet pack ./linker.tunnel -c release
- name: Install Nuget
uses: nuget/setup-nuget@v1
@@ -48,11 +84,29 @@ jobs:
- name: Push
run: |
- nuget push ./linker.tunnel/bin/release/linker.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.libs/bin/release/linker.libs.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
- nuget push ./linker.tun/bin/release/linker.tun.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.messenger/bin/release/linker.messenger.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
- nuget push ./linker.messenger/bin/release/linker.messenger.relay.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
- nuget push ./linker.messenger/bin/release/linker.messenger.signin.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
- nuget push ./linker.messenger/bin/release/linker.messenger.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.access.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.action.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.api.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.channel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
nuget push ./linker.messenger/bin/release/linker.messenger.decenter.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.entry.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.exroute.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.flow.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.forward.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.listen.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.logger.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.pcp.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.relay.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.serializer.memorypack.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.sforward.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.signin.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.socks5.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.store.file.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.sync.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.tuntap.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.messenger/bin/release/linker.messenger.updater.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.tun/bin/release/linker.tun.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
+ nuget push ./linker.tunnel/bin/release/linker.tunnel.1.6.4.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
diff --git a/linker.messenger.access/AccessApiController.cs b/linker.messenger.access/AccessApiController.cs
index 1653c419..b4a62050 100644
--- a/linker.messenger.access/AccessApiController.cs
+++ b/linker.messenger.access/AccessApiController.cs
@@ -2,6 +2,7 @@
using linker.libs.extends;
using linker.libs;
using linker.messenger.signin;
+using linker.messenger.api;
namespace linker.messenger.access
{
diff --git a/linker.messenger.access/AccessDecenter.cs b/linker.messenger.access/AccessDecenter.cs
index e93b6013..40a4d39f 100644
--- a/linker.messenger.access/AccessDecenter.cs
+++ b/linker.messenger.access/AccessDecenter.cs
@@ -1,4 +1,5 @@
using linker.libs;
+using linker.messenger.api;
using linker.messenger.decenter;
using linker.messenger.signin;
diff --git a/linker.messenger.access/AccessMessenger.cs b/linker.messenger.access/AccessMessenger.cs
index 7a5a6348..5f5bd239 100644
--- a/linker.messenger.access/AccessMessenger.cs
+++ b/linker.messenger.access/AccessMessenger.cs
@@ -1,4 +1,5 @@
using linker.libs;
+using linker.messenger.api;
using linker.messenger.signin;
namespace linker.messenger.access
diff --git a/linker.messenger.access/Entry.cs b/linker.messenger.access/Entry.cs
index a59cda88..83013170 100644
--- a/linker.messenger.access/Entry.cs
+++ b/linker.messenger.access/Entry.cs
@@ -1,6 +1,4 @@
-using linker.libs;
-using linker.libs.web;
-using linker.messenger.access;
+using linker.messenger.access;
using linker.messenger.decenter;
using Microsoft.Extensions.DependencyInjection;
namespace linker.messenger.api
diff --git a/linker.messenger.access/linker.messenger.access.csproj b/linker.messenger.access/linker.messenger.access.csproj
index caf17e9e..2efb5bae 100644
--- a/linker.messenger.access/linker.messenger.access.csproj
+++ b/linker.messenger.access/linker.messenger.access.csproj
@@ -36,6 +36,5 @@
-
diff --git a/linker.messenger.action/ActionApiController.cs b/linker.messenger.action/ActionApiController.cs
index ad37b845..be594bbe 100644
--- a/linker.messenger.action/ActionApiController.cs
+++ b/linker.messenger.action/ActionApiController.cs
@@ -1,5 +1,6 @@
using linker.libs.api;
using linker.libs.extends;
+using linker.messenger.api;
namespace linker.messenger.action
{
@@ -13,12 +14,13 @@ namespace linker.messenger.action
}
+ [Access(AccessValue.Action)]
public bool SetArgs(ApiControllerParamsInfo param)
{
actionStore.SetActionArg(param.Content);
return true;
}
-
+ [Access(AccessValue.Action)]
public bool SetServerArgs(ApiControllerParamsInfo param)
{
actionStore.SetActionArgs(param.Content.DeJson>());
diff --git a/linker.messenger.action/Entry.cs b/linker.messenger.action/Entry.cs
index f149b185..0e5e96b5 100644
--- a/linker.messenger.action/Entry.cs
+++ b/linker.messenger.action/Entry.cs
@@ -1,4 +1,7 @@
using linker.messenger.action;
+using linker.messenger.relay.server.validator;
+using linker.messenger.sforward.server.validator;
+using linker.messenger.signin.args;
using Microsoft.Extensions.DependencyInjection;
namespace linker.messenger.api
{
@@ -10,15 +13,16 @@ namespace linker.messenger.api
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
- serviceCollection.AddSingleton();
return serviceCollection;
}
public static ServiceProvider UseActionClient(this ServiceProvider serviceProvider)
{
- ApiServer apiServer=serviceProvider.GetService();
+ IApiServer apiServer = serviceProvider.GetService();
apiServer.AddPlugins(new List { serviceProvider.GetService() });
+ SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService();
+ signInArgsTransfer.AddArgs(new List { serviceProvider.GetService() });
+
return serviceProvider;
}
@@ -32,6 +36,14 @@ namespace linker.messenger.api
}
public static ServiceProvider UseActionServer(this ServiceProvider serviceProvider)
{
+ SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService();
+ signInArgsTransfer.AddArgs(new List { serviceProvider.GetService() });
+
+ RelayServerValidatorTransfer relayServerValidatorTransfer = serviceProvider.GetService();
+ relayServerValidatorTransfer.AddValidators(new List { serviceProvider.GetService() });
+
+ SForwardValidatorTransfer sForwardValidatorTransfer = serviceProvider.GetService();
+ sForwardValidatorTransfer.AddValidators(new List { serviceProvider.GetService() });
return serviceProvider;
}
}
diff --git a/linker.messenger.action/IActionStore.cs b/linker.messenger.action/IActionStore.cs
index 74a2f01a..495f9321 100644
--- a/linker.messenger.action/IActionStore.cs
+++ b/linker.messenger.action/IActionStore.cs
@@ -2,7 +2,7 @@
{
public sealed class ActionInfo
{
- public string Arg { get; set; }
+ public string Arg { get; set; } = string.Empty;
public Dictionary Args { get; set; } = new Dictionary();
}
public interface IActionStore
diff --git a/linker.messenger.action/SignInArgsAction.cs b/linker.messenger.action/SignInArgsAction.cs
index f03b300c..46c57852 100644
--- a/linker.messenger.action/SignInArgsAction.cs
+++ b/linker.messenger.action/SignInArgsAction.cs
@@ -1,5 +1,7 @@
using linker.libs.extends;
using linker.messenger.relay.server.validator;
+using linker.messenger.sforward;
+using linker.messenger.sforward.server.validator;
using linker.messenger.signin;
using linker.messenger.signin.args;
using System.Net;
diff --git a/linker.messenger.action/linker.messenger.action.csproj b/linker.messenger.action/linker.messenger.action.csproj
index 626f4b1d..d5cd6e45 100644
--- a/linker.messenger.action/linker.messenger.action.csproj
+++ b/linker.messenger.action/linker.messenger.action.csproj
@@ -34,8 +34,8 @@
+
-
diff --git a/linker.messenger.api/ApiServer.cs b/linker.messenger.api/ApiServer.cs
index 243c95c9..6b196e00 100644
--- a/linker.messenger.api/ApiServer.cs
+++ b/linker.messenger.api/ApiServer.cs
@@ -1,4 +1,5 @@
-using linker.libs.api;
+using linker.libs;
+using linker.libs.api;
using System.Reflection;
namespace linker.messenger.api
@@ -8,8 +9,10 @@ namespace linker.messenger.api
///
public sealed partial class ApiServer : libs.api.ApiServer, IApiServer
{
- public ApiServer()
+ private readonly IAccessStore accessStore;
+ public ApiServer(IAccessStore accessStore)
{
+ this.accessStore = accessStore;
}
///
@@ -19,6 +22,8 @@ namespace linker.messenger.api
{
Type voidType = typeof(void);
+ LoggerHelper.Instance.Info($"add api {string.Join(",", list.Select(c => c.GetType().Name))}");
+
foreach (IApiController obj in list)
{
Type type = obj.GetType();
@@ -30,14 +35,14 @@ namespace linker.messenger.api
{
bool istask = method.ReturnType.GetProperty("IsCompleted") != null && method.ReturnType.GetMethod("GetAwaiter") != null;
bool isTaskResult = method.ReturnType.GetProperty("Result") != null;
- /*
- ClientApiAccessAttribute accessAttr = method.GetCustomAttribute();
+
+ AccessAttribute accessAttr = method.GetCustomAttribute();
ulong access = 0;
if (accessAttr != null)
{
access = (ulong)accessAttr.Value;
}
- */
+
plugins.TryAdd(key, new PluginPathCacheInfo
{
IsVoid = method.ReturnType == voidType,
@@ -54,8 +59,7 @@ namespace linker.messenger.api
}
private bool HasAccess(ulong access)
{
- return true;
- //return accessTransfer.HasAccess((ClientApiAccess)access);
+ return accessStore.HasAccess((AccessValue)access);
}
}
}
diff --git a/linker.messenger.access/Config.cs b/linker.messenger.api/Config.cs
similarity index 99%
rename from linker.messenger.access/Config.cs
rename to linker.messenger.api/Config.cs
index 3ff41254..41a6f8f4 100644
--- a/linker.messenger.access/Config.cs
+++ b/linker.messenger.api/Config.cs
@@ -1,4 +1,4 @@
-namespace linker.messenger.access
+namespace linker.messenger.api
{
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public sealed class AccessAttribute : Attribute
diff --git a/linker.messenger.api/Entry.cs b/linker.messenger.api/Entry.cs
index 00dc38fd..fd9a7f7d 100644
--- a/linker.messenger.api/Entry.cs
+++ b/linker.messenger.api/Entry.cs
@@ -14,17 +14,19 @@ namespace linker.messenger.api
public static ServiceProvider UseApiClient(this ServiceProvider serviceProvider)
{
IApiStore apiStore = serviceProvider.GetService();
- if (apiStore.Info.ApiPort > 0)
+ IAccessStore accessStore = serviceProvider.GetService();
+ if (apiStore.Info.ApiPort > 0 && accessStore.HasAccess(AccessValue.Api))
{
- LoggerHelper.Instance.Info($"start client api server");
+ LoggerHelper.Instance.Info($"start client api");
IApiServer server = serviceProvider.GetService();
server.Websocket(apiStore.Info.ApiPort, apiStore.Info.ApiPassword);
LoggerHelper.Instance.Warning($"client api listen:{apiStore.Info.ApiPort}");
LoggerHelper.Instance.Warning($"client api password:{apiStore.Info.ApiPassword}");
}
- if (apiStore.Info.WebPort > 0)
+ if (apiStore.Info.WebPort > 0 && accessStore.HasAccess(AccessValue.Web))
{
+ LoggerHelper.Instance.Info($"start client web");
IWebServer webServer = serviceProvider.GetService();
webServer.Start(apiStore.Info.WebPort, apiStore.Info.WebRoot);
LoggerHelper.Instance.Warning($"client web listen:{apiStore.Info.WebPort}");
diff --git a/linker.messenger.access/IAccessStore.cs b/linker.messenger.api/IAccessStore.cs
similarity index 89%
rename from linker.messenger.access/IAccessStore.cs
rename to linker.messenger.api/IAccessStore.cs
index 402dba1f..bbace9b4 100644
--- a/linker.messenger.access/IAccessStore.cs
+++ b/linker.messenger.api/IAccessStore.cs
@@ -1,4 +1,4 @@
-namespace linker.messenger.access
+namespace linker.messenger.api
{
public interface IAccessStore
{
diff --git a/linker.messenger.decenter/DecenterClientTransfer.cs b/linker.messenger.decenter/DecenterClientTransfer.cs
index 7434da27..5b0d6eff 100644
--- a/linker.messenger.decenter/DecenterClientTransfer.cs
+++ b/linker.messenger.decenter/DecenterClientTransfer.cs
@@ -27,6 +27,7 @@ namespace linker.messenger.decenter
public void AddDecenters(List list)
{
+ LoggerHelper.Instance.Info($"add decenter {string.Join(",", list.Select(c => c.GetType().Name))}");
syncs = syncs.Concat(list).Distinct().ToList();
}
diff --git a/linker.messenger.decenter/linker.messenger.decenter.csproj b/linker.messenger.decenter/linker.messenger.decenter.csproj
index b7ba5d52..c5fdffea 100644
--- a/linker.messenger.decenter/linker.messenger.decenter.csproj
+++ b/linker.messenger.decenter/linker.messenger.decenter.csproj
@@ -33,7 +33,6 @@
-
diff --git a/linker.messenger.entry/LinkerMessengerEntry.cs b/linker.messenger.entry/LinkerMessengerEntry.cs
new file mode 100644
index 00000000..daeb1675
--- /dev/null
+++ b/linker.messenger.entry/LinkerMessengerEntry.cs
@@ -0,0 +1,145 @@
+using linker.messenger.api;
+using linker.messenger.decenter;
+using linker.messenger.exroute;
+using linker.messenger.flow;
+using linker.messenger.forward;
+using linker.messenger.listen;
+using linker.messenger.logger;
+using Microsoft.Extensions.DependencyInjection;
+using linker.messenger.pcp;
+using linker.messenger.relay;
+using linker.messenger.sforward;
+using linker.messenger.signin;
+using linker.messenger.socks5;
+using linker.messenger.sync;
+using linker.messenger.tunnel;
+using linker.messenger.tuntap;
+using linker.messenger.updater;
+using linker.messenger.store.file;
+using linker.messenger.serializer.memorypack;
+using linker.libs;
+
+namespace linker.messenger.entry
+{
+ public static class LinkerMessengerEntry
+ {
+ private static ServiceCollection serviceCollection;
+ private static ServiceProvider serviceProvider;
+ private static OperatingManager inited = new OperatingManager();
+ private static OperatingManager builded = new OperatingManager();
+
+ ///
+ /// 开始初始化
+ ///
+ ///
+ public static void Initialize()
+ {
+ if (inited.StartOperation() == false) return;
+
+ serviceCollection = new ServiceCollection();
+
+ serviceCollection
+ //日志
+ .AddLoggerClient()
+ //api接口和web
+ .AddApiClient()
+ //路由排除
+ .AddExRoute()
+
+ //服务器监听
+ .AddListen()
+
+ //权限
+ .AddAccessClient().AddAccessServer()
+ //自定义验证
+ .AddActionClient().AddActionServer()
+ //数据同步
+ .AddDecenterClient().AddDecenterServer()
+ //端口转发
+ .AddForwardClient().AddForwardServer()
+ //pcp
+ .AddPcpClient().AddPcpServer()
+ //中继
+ .AddRelayClient().AddRelayServer()
+ //服务器穿透
+ .AddSForwardClient().AddSForwardServer()
+ //登录
+ .AddSignInClient().AddSignInServer()
+ //socks5
+ .AddSocks5Client().AddSocks5Server()
+ //同步
+ .AddSyncClient().AddSyncServer()
+ //打洞
+ .AddTunnelClient().AddTunnelServer()
+ //虚拟网卡
+ .AddTuntapClient().AddTuntapServer()
+ //更新
+ .AddUpdaterClient().AddUpdaterServer()
+ //流量统计
+ .AddFlowClient().AddFlowServer()
+
+ //信标
+ .AddMessenger()
+ //持久化,文件
+ .AddStoreFile()
+ //序列化 MemoryPack
+ .AddSerializerMemoryPack();
+ }
+
+ ///
+ /// 注入
+ ///
+ ///
+ public static void AddService() where TService : class
+ {
+ serviceCollection.AddSingleton();
+ }
+ ///
+ /// 注入
+ ///
+ ///
+ ///
+ public static void AddService() where TService : class where TImplementation : class, TService
+ {
+ serviceCollection.AddSingleton();
+ }
+
+ ///
+ /// 运行起来
+ ///
+ ///
+ public static void Build()
+ {
+ if (builded.StartOperation() == false) return;
+
+ serviceProvider = serviceCollection.BuildServiceProvider();
+ serviceProvider.UseMessenger().UseStoreFile().UseSerializerMemoryPack();
+
+ ICommonStore commonStore = serviceProvider.GetService();
+ if ((commonStore.Modes & CommonModes.Server) == CommonModes.Server)
+ {
+ serviceProvider.UseAccessServer().UseActionServer().UseDecenterServer().UseForwardServer().UsePcpServer().UseRelayServer().UseSForwardServer().UseSignInServer().UseSocks5Server().UseSyncServer().UseTunnelServer().UseTuntapServer().UseUpdaterServer().UseFlowServer();
+
+ serviceProvider.UseListen();
+ }
+
+ if ((commonStore.Modes & CommonModes.Client) == CommonModes.Client)
+ {
+ serviceProvider.UseLoggerClient().UseApiClient().UseExRoute().UseAccessClient().UseActionClient().UseDecenterClient().UseForwardClient().UsePcpClient().UseRelayClient().UseSForwardClient().UseSocks5Client().UseSyncClient().UseTunnelClient().UseTuntapClient().UseUpdaterClient().UseFlowClient();
+
+ serviceProvider.UseSignInClient();
+ }
+ }
+
+ ///
+ /// 获取服务
+ ///
+ ///
+ ///
+ public static TService GetService() where TService : class
+ {
+ return serviceProvider.GetService();
+ }
+
+ }
+}
diff --git a/linker.messenger.entry/linker.messenger.entry.csproj b/linker.messenger.entry/linker.messenger.entry.csproj
index 5f73c79d..3263936a 100644
--- a/linker.messenger.entry/linker.messenger.entry.csproj
+++ b/linker.messenger.entry/linker.messenger.entry.csproj
@@ -30,4 +30,28 @@
false
True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/linker.messenger.example/Program.cs b/linker.messenger.example/Program.cs
deleted file mode 100644
index 0bd0e852..00000000
--- a/linker.messenger.example/Program.cs
+++ /dev/null
@@ -1,540 +0,0 @@
-using linker.libs;
-using linker.libs.extends;
-using linker.messenger.relay.client;
-using linker.messenger.relay.client.transport;
-using linker.messenger.relay.messenger;
-using linker.messenger.relay.server;
-using linker.messenger.relay.server.caching;
-using linker.messenger.relay.server.validator;
-using linker.messenger.signin;
-using linker.messenger.signin.args;
-using linker.messenger.tunnel;
-using linker.plugins.tunnel;
-using linker.tunnel;
-using linker.tunnel.connection;
-using linker.tunnel.transport;
-using System.Net;
-using System.Net.Sockets;
-using System.Security.Cryptography.X509Certificates;
-using System.Text;
-
-namespace linker.messenger.example
-{
- internal class Program
- {
- public static PublicConfigInfo publicConfigInfo = new PublicConfigInfo
- {
- Certificate = new X509Certificate2("./snltty.pfx", "oeq9tw1o"),
- TunnelTransports = new List
- {
- new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="udp", Order=1, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true },
- // new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="UdpPortMap", Order=2, ProtocolType= TunnelProtocolType.Udp.ToString(), Reverse=true, SSL=true },
- new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpP2PNAT", Order=3, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true },
- // new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TransportUdpPortMap", Order=4, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true },
- // new TunnelTransportItemInfo{ BufferSize=3, Disabled=false, DisableReverse=false, DisableSSL=false, Name="TcpPortMap", Order=5, ProtocolType= TunnelProtocolType.Tcp.ToString(), Reverse=true, SSL=true },
- }
- };
-
- static async Task Main(string[] args)
- {
- LoggerConsole();
-
- Console.WriteLine($"输入server 或者 client:");
- string type = Console.ReadLine();
-
- if (type == "server")
- {
- Server();
- }
- else
- {
- await Client();
- }
-
- Console.ReadLine();
- }
-
- public sealed class TunnelConnectionReceiveCallback : ITunnelConnectionReceiveCallback
- {
- public async Task Closed(ITunnelConnection connection, object state)
- {
- Console.WriteLine($"{(connection.Type == TunnelType.P2P ? "打洞" : "中继")}关闭,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的关闭");
- await Task.CompletedTask;
- }
-
- public async Task Receive(ITunnelConnection connection, ReadOnlyMemory data, object state)
- {
- Console.WriteLine($"{(connection.Type == TunnelType.P2P ? "打洞" : "中继")}数据,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的数据:{data.Span.GetString()}");
- await Task.CompletedTask;
- }
- }
- private static async Task Client()
- {
- //序列化
- ISerializer serializer = new Serializer();
-
- //信标发送和接受
- IMessengerSender messengerSender = new MessengerSender();
- IMessengerResolver messengerResolver = new MessengerResolver(messengerSender);
-
- //打洞相关
- TunnelClientExcludeIPTransfer tunnelExcludeIPTransfer = new TunnelClientExcludeIPTransfer();
- //tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(new List());
- TunnelClientMessengerAdapter tunnelMessengerAdapter = new TunnelClientMessengerAdapter(messengerSender, tunnelExcludeIPTransfer, serializer, new TunnelMessengerAdapterStore());
- TunnelTransfer tunnelTransfer = new TunnelTransfer(tunnelMessengerAdapter);
- tunnelTransfer.SetConnectedCallback("default", (connection) =>
- {
- Console.WriteLine($"打洞成功,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的连接");
- connection.BeginReceive(new TunnelConnectionReceiveCallback(), null);
- });
- TunnelClientMessenger tunnelClientMessenger = new TunnelClientMessenger(tunnelTransfer, messengerSender, serializer);
-
-
- //中继相关
- IRelayClientStore relayClientStore = new RelayClientStore();
- RelayClientTransfer relayClientTransfer = new RelayClientTransfer(messengerSender, serializer, relayClientStore);
- relayClientTransfer.SetConnectedCallback("default", (connection) =>
- {
- Console.WriteLine($"中继成功,收到 {connection.IPEndPoint} {connection.RemoteMachineId} 的连接");
- connection.BeginReceive(new TunnelConnectionReceiveCallback(), null);
- });
- RelayClientMessenger relayClientMessenger = new RelayClientMessenger(relayClientTransfer, serializer);
-
- //加载这些信标处理器
- messengerResolver.AddMessenger(new List
- {
- tunnelClientMessenger,
- relayClientMessenger
- });
-
-
- //加载登录参数
- SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer();
- signInArgsTransfer.AddArgs(new List {
- new MySignInArgs()
- });
- Dictionary argsDic = new Dictionary();
- await signInArgsTransfer.Invoke(string.Empty, argsDic);
-
- Console.WriteLine($"输入服务端ip端口:");
- publicConfigInfo.Host = Console.ReadLine();
-
- Console.WriteLine($"开始连接服务器");
- IPEndPoint server = NetworkHelper.GetEndPoint(publicConfigInfo.Host, 1802);
- Socket socket = new Socket(server.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
- socket.KeepAlive();
- await socket.ConnectAsync(server).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
- publicConfigInfo.SignConnection = await messengerResolver.BeginReceiveClient(socket, true, (byte)ResolverType.Messenger).ConfigureAwait(false);
-
- Console.WriteLine($"开始登录");
- MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
- {
- Connection = publicConfigInfo.SignConnection,
- MessengerId = (ushort)SignInMessengerIds.SignIn_V_1_3_1,
- Timeout = 2000,
- Payload = serializer.Serialize(new SignInfo
- {
- MachineName = Dns.GetHostName(),
- MachineId = string.Empty,
- Version = VersionHelper.version,
- Args = argsDic,
- GroupId = "default"
- })
- }).ConfigureAwait(false);
- if (resp.Code != MessageResponeCodes.OK)
- {
- Console.WriteLine($"登录失败 : {resp.Code}");
- publicConfigInfo.SignConnection?.Disponse(6);
- return;
- }
-
- SignInResponseInfo signResp = serializer.Deserialize(resp.Data.Span).DeJson();
- if (signResp.Status == false)
- {
- Console.WriteLine($"登录失败 : {signResp.Msg}");
- publicConfigInfo.SignConnection?.Disponse(6);
- return;
- }
- publicConfigInfo.SignConnection.Id = signResp.MachineId;
- Console.WriteLine($"你的id:{signResp.MachineId}");
- tunnelTransfer.Refresh();
-
-
- //获取在线列表,其它功能,参照 SignInServerMessenger 里的方法serializer.Deserialize 什么,就传什么
- resp = await messengerSender.SendReply(new MessageRequestWrap
- {
- Connection = publicConfigInfo.SignConnection,
- MessengerId = (ushort)SignInMessengerIds.List,
- Timeout = 2000,
- Payload = serializer.Serialize(new SignInListRequestInfo
- {
- Asc = true,
- Page = 1,
- Size = 10
- })
- }).ConfigureAwait(false);
- if (resp.Code == MessageResponeCodes.OK)
- {
- Console.WriteLine($"当前在线 : {serializer.Deserialize(resp.Data.Span).List.ToJson()}");
- }
-
-
-
- Console.WriteLine($"去连接吗?,1打洞,2中继:");
- string connect = Console.ReadLine();
-
- Console.WriteLine($"输入对方id:");
- string id = Console.ReadLine();
-
- ITunnelConnection tunnelConnection = null;
- switch (connect)
- {
- case "1":
- {
- Console.WriteLine($"正在打洞.......");
- tunnelConnection = await tunnelTransfer.ConnectAsync(id, "default", TunnelProtocolType.None);
- Console.WriteLine($"打洞==》{(tunnelConnection == null ? "失败" : "成功")}");
- }
- break;
- case "2":
- {
- Console.WriteLine($"正在中继.......");
- tunnelConnection = await relayClientTransfer.ConnectAsync(publicConfigInfo.SignConnection.Id, id, "default");
- Console.WriteLine($"中继==》{(tunnelConnection == null ? "失败" : "成功")}");
- }
- break;
- default:
- break;
- }
- if (tunnelConnection != null)
- {
- for (int i = 0; i < 10; i++)
- {
- string msg = $"hello {i}";
- Console.WriteLine($"发送:{msg}");
- var msgBytes = msg.ToBytes();
-
- //首部4字节存长度,剩下的才是真实数据
- byte[] bytes = new byte[4 + msgBytes.Length];
- msgBytes.Length.ToBytes(bytes);
- msgBytes.AsMemory().CopyTo(bytes.AsMemory(4));
-
- await tunnelConnection.SendAsync(bytes);
- await Task.Delay(1000);
- }
- }
- }
-
- private static void Server()
- {
- Console.WriteLine($"输入服务端端口:");
- publicConfigInfo.Port = int.Parse(Console.ReadLine());
-
- //序列化
- ISerializer serializer = new Serializer();
-
- //信标发送和接受
- IMessengerSender messengerSender = new MessengerSender();
- IMessengerResolver messengerResolver = new MessengerResolver(messengerSender);
- messengerResolver.Initialize(publicConfigInfo.Certificate);
- MessengerResolverResolver messengerResolverResolver = new MessengerResolverResolver(messengerResolver);
-
- //登录相关
- SignInArgsTransfer signInArgsTransfer = new SignInArgsTransfer();
- signInArgsTransfer.AddArgs(new List {
- new MySignInArgs()
- });
- ISignInServerStore signInStore = new SignInStore();
- SignInServerCaching signCaching = new SignInServerCaching(signInStore, signInArgsTransfer);
- SignInServerMessenger signInServerMessenger = new SignInServerMessenger(messengerSender, signCaching, serializer);
-
- //打洞相关
- TunnelServerExternalResolver tunnelExternalResolver = new TunnelServerExternalResolver();
- TunnelServerMessenger tunnelServerMessenger = new TunnelServerMessenger(messengerSender, signCaching, serializer);
-
- //中继相关
- IRelayServerMasterStore relayServerMasterStore = new RelayServerMasterStore();
- IRelayServerNodeStore relayServerNodeStore = new RelayServerNodeStore();
- RelayServerNodeTransfer relayServerNodeTransfer = new RelayServerNodeTransfer(serializer, relayServerNodeStore, relayServerMasterStore);
- RelayServerResolver relayServerResolver = new RelayServerResolver(relayServerNodeTransfer, serializer);
- IRelayServerCaching relayServerCaching = new RelayServerCachingMemory(serializer);
- RelayServerMasterTransfer relayServerMasterTransfer = new RelayServerMasterTransfer(relayServerCaching, serializer, relayServerMasterStore);
- RelayServerReportResolver relayServerReportResolver = new RelayServerReportResolver(relayServerMasterTransfer);
- //自定义中继验证
- RelayServerValidatorTransfer relayServerValidatorTransfer = new RelayServerValidatorTransfer();
- //relayServerValidatorTransfer.LoadValidators(new List { });
- RelayServerMessenger relayServerMessenger = new RelayServerMessenger(messengerSender, signCaching, serializer, relayServerMasterTransfer, relayServerValidatorTransfer);
-
- //加载信标处理器
- messengerResolver.AddMessenger(new List
- {
- signInServerMessenger,
- tunnelServerMessenger,
- relayServerMessenger
- });
-
-
- //加载消息分发器
- ResolverTransfer resolverTransfer = new ResolverTransfer();
- resolverTransfer.AddResolvers(new List {
- messengerResolverResolver,
- tunnelExternalResolver,
- relayServerReportResolver,
- relayServerResolver
- });
-
- //TCP
- var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- socket.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port));
- socket.Listen(int.MaxValue);
- TimerHelper.Async(async () =>
- {
- while (true)
- {
- var client = await socket.AcceptAsync();
- _ = resolverTransfer.BeginReceive(client);
- }
- });
-
- //UDP
- Socket socketUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- socketUdp.Bind(new IPEndPoint(IPAddress.Any, publicConfigInfo.Port));
- socketUdp.WindowsUdpBug();
- TimerHelper.Async(async () =>
- {
- IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
- byte[] buffer = new byte[1 * 1024 * 1024];
- while (true)
- {
- try
- {
- SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, SocketFlags.None, endPoint).ConfigureAwait(false);
- IPEndPoint ep = result.RemoteEndPoint as IPEndPoint;
- _ = resolverTransfer.BeginReceive(socketUdp, ep, buffer.AsMemory(0, result.ReceivedBytes));
- }
- catch (Exception ex)
- {
- LoggerHelper.Instance.Error(ex);
- break;
- }
- }
- });
- }
-
- private static void LoggerConsole()
- {
- LoggerHelper.Instance.OnLogger += (model) =>
- {
- ConsoleColor currentForeColor = Console.ForegroundColor;
- switch (model.Type)
- {
- case LoggerTypes.DEBUG:
- Console.ForegroundColor = ConsoleColor.Blue;
- break;
- case LoggerTypes.INFO:
- Console.ForegroundColor = ConsoleColor.White;
- break;
- case LoggerTypes.WARNING:
- Console.ForegroundColor = ConsoleColor.Yellow;
- break;
- case LoggerTypes.ERROR:
- Console.ForegroundColor = ConsoleColor.Red;
- break;
- default:
- break;
- }
- string line = $"[{model.Type,-7}][{model.Time:yyyy-MM-dd HH:mm:ss}]:{model.Content}";
- Console.WriteLine(line);
- Console.ForegroundColor = currentForeColor;
- };
- }
- }
-
- public sealed class MyRelayServerValidator : IRelayServerValidator
- {
- ///
- /// 验证,服务端会调用
- ///
- /// 中继参数
- /// 来源客户端
- /// 目标客户端
- ///
- public async Task Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine)
- {
- //返回空字符串,表示成功,不空为错误信息则登录失败
- return await Task.FromResult(string.Empty);
- }
- }
-
- public sealed class MySignInArgs : ISignInArgs
- {
- ///
- /// 客户端调用
- ///
- ///
- ///
- ///
- public async Task Invoke(string host, Dictionary args)
- {
- //在这里加入你喜欢的数据
-
- //返回空字符串,表示成功,不空为错误信息
- return await Task.FromResult(string.Empty);
- }
-
- ///
- /// 服务端调用
- ///
- /// 本次登录的信息
- /// 如果以前登录过就有信息,否则MachineId为空
- ///
- ///
- public async Task Validate(SignInfo signInfo, SignCacheInfo cache)
- {
- //在这里进行你的验证
-
- //返回空字符串,表示成功,不空为错误信息则登录失败
- return await Task.FromResult(string.Empty);
- }
- }
-
- public sealed class PublicConfigInfo
- {
- public IConnection SignConnection { get; set; }
- public X509Certificate2 Certificate { get; set; }
- public List TunnelTransports { get; set; }
-
- public string Host { get; set; }
- public int Port { get; set; } = 12345;
- }
-
- ///
- /// 中继的客户端存储库
- ///
- public sealed class RelayClientStore : IRelayClientStore
- {
- public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate;
-
- public IConnection SigninConnection => Program.publicConfigInfo.SignConnection;
-
- public string SecretKey => string.Empty;
-
- public bool Disabled => false;
-
- public bool SSL => true;
-
- public RelayClientType RelayType => RelayClientType.Linker;
- }
-
- ///
- /// 中继节点信息存储库
- ///
- public sealed class RelayServerNodeStore : IRelayServerNodeStore
- {
- public int ServicePort => Program.publicConfigInfo.Port;
-
- public RelayServerNodeInfo Node => new RelayServerNodeInfo { };
-
- public void Confirm()
- {
- }
-
- public void SetMaxGbTotalLastBytes(ulong value)
- {
- }
-
- public void SetMaxGbTotalMonth(int month)
- {
- }
- }
- ///
- /// 中继主机信息存储库
- ///
- public sealed class RelayServerMasterStore : IRelayServerMasterStore
- {
- public RelayServerMasterInfo Master => new RelayServerMasterInfo { SecretKey = "snltty" };
- }
-
- ///
- /// 自定义打洞的存储库
- ///
- public sealed class TunnelMessengerAdapterStore : ITunnelClientStore
- {
- public IConnection SignConnection => Program.publicConfigInfo.SignConnection;
- public X509Certificate2 Certificate => Program.publicConfigInfo.Certificate;
-
- public int RouteLevelPlus => 0;
- public int PortMapPrivate => 0;
- public int PortMapPublic => 0;
-
- public TunnelMessengerAdapterStore()
- {
- }
-
- public async Task> GetTunnelTransports()
- {
- return await Task.FromResult(Program.publicConfigInfo.TunnelTransports);
- }
- public async Task SetTunnelTransports(List list)
- {
- return await Task.FromResult(true);
- }
- }
-
- ///
- /// 自定义序列化
- ///
- public sealed class Serializer : ISerializer
- {
- public T Deserialize(ReadOnlySpan buffer)
- {
- return buffer.GetString().DeJson();
- }
-
- public byte[] Serialize(T value)
- {
- return value.ToJson().ToBytes();
- }
- }
- ///
- /// 自定义登录持久化存储
- ///
- public sealed class SignInStore : ISignInServerStore
- {
- public void Confirm()
- {
- }
-
- public bool Delete(string id)
- {
- return true;
- }
-
- public SignCacheInfo Find(string id)
- {
- return null;
- }
-
- public IEnumerable Find()
- {
- return new List();
- }
-
- public string Insert(SignCacheInfo value)
- {
- return string.Empty;
- }
-
- public string NewId()
- {
- return Guid.NewGuid().ToString();
- }
-
- public bool Update(SignCacheInfo value)
- {
- return true;
- }
- }
-
-
-}
diff --git a/linker.messenger.example/linker.messenger.example.csproj b/linker.messenger.example/linker.messenger.example.csproj
deleted file mode 100644
index 0d01764d..00000000
--- a/linker.messenger.example/linker.messenger.example.csproj
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
- Exe
- net8.0
- enable
- enable
- true
- 1.6.4
- 1.6.4
- 1.6.4
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
-
-
diff --git a/linker.messenger.example/snltty.pfx b/linker.messenger.example/snltty.pfx
deleted file mode 100644
index 8028c16d..00000000
Binary files a/linker.messenger.example/snltty.pfx and /dev/null differ
diff --git a/linker.messenger.exroute/ExRouteTransfer.cs b/linker.messenger.exroute/ExRouteTransfer.cs
index 93791bd1..a01853c5 100644
--- a/linker.messenger.exroute/ExRouteTransfer.cs
+++ b/linker.messenger.exroute/ExRouteTransfer.cs
@@ -1,4 +1,5 @@
-using System.Net;
+using linker.libs;
+using System.Net;
namespace linker.messenger.exroute
{
@@ -12,6 +13,7 @@ namespace linker.messenger.exroute
public void AddExRoutes(List list)
{
+ LoggerHelper.Instance.Info($"add exroute {string.Join(",", list.Select(c => c.GetType().Name))}");
excludes = excludes.Concat(list).Distinct().ToList();
}
diff --git a/linker.messenger.flow/Entry.cs b/linker.messenger.flow/Entry.cs
new file mode 100644
index 00000000..e7fc369f
--- /dev/null
+++ b/linker.messenger.flow/Entry.cs
@@ -0,0 +1,78 @@
+using linker.messenger.api;
+using linker.messenger.flow.messenger;
+using linker.messenger.relay.server;
+using linker.messenger.tunnel;
+using linker.plugins.sforward.proxy;
+using Microsoft.Extensions.DependencyInjection;
+namespace linker.messenger.flow
+{
+ public static class Entry
+ {
+ public static ServiceCollection AddFlowClient(this ServiceCollection serviceCollection)
+ {
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ return serviceCollection;
+ }
+ public static ServiceProvider UseFlowClient(this ServiceProvider serviceProvider)
+ {
+ IApiServer apiServer = serviceProvider.GetService();
+ apiServer.AddPlugins(new List { serviceProvider.GetService() });
+
+ FlowTransfer flowTransfer = serviceProvider.GetService();
+ flowTransfer.AddFlows(new List { serviceProvider.GetService() });
+
+ return serviceProvider;
+ }
+
+
+ public static ServiceCollection AddFlowServer(this ServiceCollection serviceCollection)
+ {
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
+ return serviceCollection;
+ }
+ public static ServiceProvider UseFlowServer(this ServiceProvider serviceProvider)
+ {
+
+ FlowTransfer flowTransfer = serviceProvider.GetService();
+ flowTransfer.AddFlows(new List {
+ serviceProvider.GetService(),
+ serviceProvider.GetService(),
+ serviceProvider.GetService(),
+ serviceProvider.GetService(),
+ serviceProvider.GetService(),
+ });
+
+ IMessengerResolver messengerResolver = serviceProvider.GetService();
+ messengerResolver.AddMessenger(new List { serviceProvider.GetService() });
+
+
+ ResolverTransfer resolverTransfer = serviceProvider.GetService();
+ resolverTransfer.AddResolvers(new List { serviceProvider.GetService() });
+
+ return serviceProvider;
+ }
+ }
+}
diff --git a/linker/plugins/flow/ExternalFlow.cs b/linker.messenger.flow/ExternalFlow.cs
similarity index 96%
rename from linker/plugins/flow/ExternalFlow.cs
rename to linker.messenger.flow/ExternalFlow.cs
index dee157d1..9678be03 100644
--- a/linker/plugins/flow/ExternalFlow.cs
+++ b/linker.messenger.flow/ExternalFlow.cs
@@ -1,5 +1,5 @@
using linker.messenger.tunnel;
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
public sealed class ExternalFlow : IFlow
{
diff --git a/linker/plugins/flow/FlowClientApiController.cs b/linker.messenger.flow/FlowApiController.cs
similarity index 61%
rename from linker/plugins/flow/FlowClientApiController.cs
rename to linker.messenger.flow/FlowApiController.cs
index daff88f4..def15fac 100644
--- a/linker/plugins/flow/FlowClientApiController.cs
+++ b/linker.messenger.flow/FlowApiController.cs
@@ -1,35 +1,28 @@
-using linker.libs.api;
-using linker.config;
-using linker.serializer;
-using linker.client.config;
-using linker.plugins.client;
-using linker.plugins.capi;
-using linker.plugins.flow.messenger;
+using linker.libs;
+using linker.libs.api;
using linker.libs.extends;
-using linker.plugins.relay.client;
-using linker.plugins.sforward;
-using linker.messenger;
+using linker.messenger.api;
+using linker.messenger.flow.messenger;
+using linker.messenger.relay.client;
+using linker.messenger.sforward.client;
using linker.messenger.signin;
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
- public sealed class FlowClientApiController : IApiClientController
+ public sealed class FlowApiController : IApiController
{
private readonly IMessengerSender messengerSender;
private readonly SignInClientState signInClientState;
- private readonly FileConfig config;
- private readonly RunningConfig runningConfig;
- private readonly RelayClientConfigTransfer relayClientConfigTransfer;
- private readonly SForwardTransfer sForwardTransfer;
-
- public FlowClientApiController(IMessengerSender messengerSender, SignInClientState signInClientState, FileConfig config, RunningConfig runningConfig, RelayClientConfigTransfer relayClientConfigTransfer, SForwardTransfer sForwardTransfer)
+ private readonly IRelayClientStore relayClientStore;
+ private readonly ISForwardClientStore sForwardClientStore;
+ private readonly ISerializer serializer;
+ public FlowApiController(IMessengerSender messengerSender, SignInClientState signInClientState, IRelayClientStore relayClientStore, ISForwardClientStore sForwardClientStore, ISerializer serializer)
{
this.messengerSender = messengerSender;
this.signInClientState = signInClientState;
- this.config = config;
- this.runningConfig = runningConfig;
- this.relayClientConfigTransfer = relayClientConfigTransfer;
- this.sForwardTransfer = sForwardTransfer;
+ this.relayClientStore = relayClientStore;
+ this.sForwardClientStore = sForwardClientStore;
+ this.serializer = serializer;
}
public async Task GetFlows(ApiControllerParamsInfo param)
@@ -41,7 +34,7 @@ namespace linker.plugins.flow
});
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{
- return Serializer.Deserialize(resp.Data.Span);
+ return serializer.Deserialize(resp.Data.Span);
}
return new FlowInfo();
}
@@ -54,45 +47,45 @@ namespace linker.plugins.flow
});
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{
- return Serializer.Deserialize>(resp.Data.Span);
+ return serializer.Deserialize>(resp.Data.Span);
}
return new Dictionary();
}
- [ClientApiAccessAttribute(ClientApiAccess.SForwardFlow)]
+ [Access(AccessValue.SForwardFlow)]
public async Task GetSForwardFlows(ApiControllerParamsInfo param)
{
SForwardFlowRequestInfo info = param.Content.DeJson();
- info.SecretKey = sForwardTransfer.SecretKey;
+ info.SecretKey = sForwardClientStore.SecretKey;
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.SForward,
- Payload = Serializer.Serialize(info)
+ Payload = serializer.Serialize(info)
});
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{
- return Serializer.Deserialize(resp.Data.Span);
+ return serializer.Deserialize(resp.Data.Span);
}
return new SForwardFlowResponseInfo();
}
- [ClientApiAccessAttribute(ClientApiAccess.RelayFlow)]
+ [Access(AccessValue.RelayFlow)]
public async Task GetRelayFlows(ApiControllerParamsInfo param)
{
RelayFlowRequestInfo info = param.Content.DeJson();
- info.SecretKey = relayClientConfigTransfer.Server.SecretKey;
+ info.SecretKey = relayClientStore.Server.SecretKey;
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)FlowMessengerIds.Relay,
- Payload = Serializer.Serialize(info)
+ Payload = serializer.Serialize(info)
});
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
{
- return Serializer.Deserialize(resp.Data.Span);
+ return serializer.Deserialize(resp.Data.Span);
}
return new RelayFlowResponseInfo();
}
diff --git a/linker/plugins/flow/FlowResolver.cs b/linker.messenger.flow/FlowResolver.cs
similarity index 98%
rename from linker/plugins/flow/FlowResolver.cs
rename to linker.messenger.flow/FlowResolver.cs
index eb86c999..0648850d 100644
--- a/linker/plugins/flow/FlowResolver.cs
+++ b/linker.messenger.flow/FlowResolver.cs
@@ -1,13 +1,12 @@
using linker.libs;
using linker.libs.extends;
-using linker.messenger;
using linker.messenger.signin;
using System.Buffers;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
public sealed class FlowResolver : IResolver, IFlow
{
diff --git a/linker/plugins/flow/FlowTransfer.cs b/linker.messenger.flow/FlowTransfer.cs
similarity index 60%
rename from linker/plugins/flow/FlowTransfer.cs
rename to linker.messenger.flow/FlowTransfer.cs
index bd7fffaa..157c6cba 100644
--- a/linker/plugins/flow/FlowTransfer.cs
+++ b/linker.messenger.flow/FlowTransfer.cs
@@ -1,4 +1,6 @@
-namespace linker.plugins.flow
+using linker.libs;
+
+namespace linker.messenger.flow
{
public sealed class FlowTransfer
{
@@ -7,9 +9,10 @@
{
}
- public void LoadFlows(List flows)
+ public void AddFlows(List list)
{
- this.flows = flows;
+ LoggerHelper.Instance.Info($"add flow {string.Join(",", list.Select(c => c.GetType().Name))}");
+ this.flows = this.flows.Concat(list).Distinct().ToList();
}
public Dictionary GetFlows()
diff --git a/linker/plugins/flow/IFlow.cs b/linker.messenger.flow/IFlow.cs
similarity index 76%
rename from linker/plugins/flow/IFlow.cs
rename to linker.messenger.flow/IFlow.cs
index edba45bb..4e3af58b 100644
--- a/linker/plugins/flow/IFlow.cs
+++ b/linker.messenger.flow/IFlow.cs
@@ -1,7 +1,6 @@
-using MemoryPack;
-using System.Text.Json.Serialization;
+using System.Text.Json.Serialization;
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
public interface IFlow
{
@@ -10,17 +9,15 @@ namespace linker.plugins.flow
public string FlowName { get; }
}
- [MemoryPackable]
public partial class FlowItemInfo
{
public ulong ReceiveBytes { get; set; }
public ulong SendtBytes { get; set; }
- [MemoryPackIgnore, JsonIgnore]
+ [JsonIgnore]
public string FlowName { get; set; }
}
- [MemoryPackable]
public sealed partial class FlowInfo
{
public Dictionary Items { get; set; }
diff --git a/linker/plugins/flow/MessengerFlow.cs b/linker.messenger.flow/MessengerFlow.cs
similarity index 94%
rename from linker/plugins/flow/MessengerFlow.cs
rename to linker.messenger.flow/MessengerFlow.cs
index 2d1a6149..d30f7e51 100644
--- a/linker/plugins/flow/MessengerFlow.cs
+++ b/linker.messenger.flow/MessengerFlow.cs
@@ -1,12 +1,10 @@
-using linker.messenger;
-
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
public sealed class MessengerResolverFlow : MessengerResolver
{
private readonly MessengerFlow messengerFlow;
- public MessengerResolverFlow(IMessengerSender sender, MessengerFlow messengerFlow) : base(sender)
+ public MessengerResolverFlow(IMessengerSender sender, MessengerFlow messengerFlow,IMessengerStore messengerStore) : base(sender, messengerStore)
{
this.messengerFlow = messengerFlow;
}
diff --git a/linker/plugins/flow/RelayFlow.cs b/linker.messenger.flow/RelayFlow.cs
similarity index 95%
rename from linker/plugins/flow/RelayFlow.cs
rename to linker.messenger.flow/RelayFlow.cs
index 1020c243..6afc8b04 100644
--- a/linker/plugins/flow/RelayFlow.cs
+++ b/linker.messenger.flow/RelayFlow.cs
@@ -1,9 +1,8 @@
using linker.libs;
using linker.messenger.relay.server;
-using MemoryPack;
using System.Text.Json.Serialization;
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
public sealed class RelayReportFlow : IFlow
{
@@ -37,7 +36,7 @@ namespace linker.plugins.flow
public sealed class RelayResolverFlow : RelayServerResolver
{
private readonly RelayFlow relayFlow;
- public RelayResolverFlow(RelayFlow relayFlow, RelayServerNodeTransfer relayServerNodeTransfer,ISerializer serializer) : base(relayServerNodeTransfer, serializer)
+ public RelayResolverFlow(RelayFlow relayFlow, RelayServerNodeTransfer relayServerNodeTransfer, ISerializer serializer) : base(relayServerNodeTransfer, serializer)
{
this.relayFlow = relayFlow;
}
@@ -184,7 +183,6 @@ namespace linker.plugins.flow
}
}
- [MemoryPackable]
public sealed partial class RelayFlowItemInfo : FlowItemInfo
{
public ulong DiffReceiveBytes { get; set; }
@@ -192,21 +190,18 @@ namespace linker.plugins.flow
public string FromName { get; set; }
public string ToName { get; set; }
- [MemoryPackIgnore]
public string GroupId { get; set; }
- [MemoryPackIgnore, JsonIgnore]
+ [JsonIgnore]
public ulong OldReceiveBytes { get; set; }
- [MemoryPackIgnore, JsonIgnore]
+ [JsonIgnore]
public ulong OldSendtBytes { get; set; }
}
- [MemoryPackable]
public sealed partial class RelayFlowRequestInfo
{
public string Key { get; set; } = string.Empty;
- [MemoryPackIgnore]
public string GroupId { get; set; } = string.Empty;
public string SecretKey { get; set; } = string.Empty;
public int Page { get; set; } = 1;
@@ -228,7 +223,6 @@ namespace linker.plugins.flow
Asc = 1,
}
- [MemoryPackable]
public sealed partial class RelayFlowResponseInfo
{
public int Page { get; set; }
diff --git a/linker/plugins/flow/SForwardFlow.cs b/linker.messenger.flow/SForwardFlow.cs
similarity index 96%
rename from linker/plugins/flow/SForwardFlow.cs
rename to linker.messenger.flow/SForwardFlow.cs
index 7ed6b383..0273a011 100644
--- a/linker/plugins/flow/SForwardFlow.cs
+++ b/linker.messenger.flow/SForwardFlow.cs
@@ -1,9 +1,8 @@
using linker.libs;
using linker.plugins.sforward.proxy;
-using MemoryPack;
using System.Text.Json.Serialization;
-namespace linker.plugins.flow
+namespace linker.messenger.flow
{
public sealed class SForwardProxyFlow: SForwardProxy
{
@@ -125,28 +124,24 @@ namespace linker.plugins.flow
}
}
- [MemoryPackable]
public sealed partial class SForwardFlowItemInfo : FlowItemInfo
{
public ulong DiffReceiveBytes { get; set; }
public ulong DiffSendtBytes { get; set; }
public string Key { get; set; }
- [MemoryPackIgnore]
public string GroupId { get; set; }
- [MemoryPackIgnore, JsonIgnore]
+ [ JsonIgnore]
public ulong OldReceiveBytes { get; set; }
- [MemoryPackIgnore, JsonIgnore]
+ [ JsonIgnore]
public ulong OldSendtBytes { get; set; }
}
- [MemoryPackable]
public sealed partial class SForwardFlowRequestInfo
{
public string Key { get; set; } = string.Empty;
- [MemoryPackIgnore]
public string GroupId { get; set; } = string.Empty;
public string SecretKey { get; set; } = string.Empty;
@@ -169,7 +164,6 @@ namespace linker.plugins.flow
Asc = 1,
}
- [MemoryPackable]
public sealed partial class SForwardFlowResponseInfo
{
public int Page { get; set; }
diff --git a/linker.messenger.flow/linker.messenger.flow.csproj b/linker.messenger.flow/linker.messenger.flow.csproj
new file mode 100644
index 00000000..7168fb0a
--- /dev/null
+++ b/linker.messenger.flow/linker.messenger.flow.csproj
@@ -0,0 +1,42 @@
+
+
+
+
+ net8.0
+ enable
+ disable
+ true
+ false
+ true
+ True
+ linker messenger flow
+ snltty
+ snltty
+ linker messenger flow
+ snltty
+ https://github.com/snltty/linker
+ https://github.com/snltty/linker
+ linker messenger flow
+ 1.6.4
+ 1.6.4
+ 1.6.4
+
+
+
+ full
+ true
+
+
+ none
+ false
+ True
+
+
+
+
+
+
+
+
+
+
diff --git a/linker/plugins/flow/messenger/FlowMessenger.cs b/linker.messenger.flow/messenger/FlowMessenger.cs
similarity index 68%
rename from linker/plugins/flow/messenger/FlowMessenger.cs
rename to linker.messenger.flow/messenger/FlowMessenger.cs
index 112cd585..9856958a 100644
--- a/linker/plugins/flow/messenger/FlowMessenger.cs
+++ b/linker.messenger.flow/messenger/FlowMessenger.cs
@@ -1,11 +1,9 @@
-using linker.config;
-using linker.messenger;
+using linker.libs;
+using linker.messenger.relay.server;
+using linker.messenger.sforward.server;
using linker.messenger.signin;
-using linker.plugins.relay.server;
-using linker.plugins.sforward;
-using linker.serializer;
-namespace linker.plugins.flow.messenger
+namespace linker.messenger.flow.messenger
{
public sealed class FlowMessenger : IMessenger
{
@@ -14,22 +12,22 @@ namespace linker.plugins.flow.messenger
private readonly SForwardFlow sForwardFlow;
private readonly RelayFlow relayFlow;
private readonly SignInServerCaching signCaching;
- private readonly FileConfig fileConfig;
- private readonly RelayServerConfigTransfer relayServerConfigTransfer;
- private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
+ private readonly IRelayServerStore relayServerStore;
+ private readonly ISForwardServerStore sForwardServerStore;
+ private readonly ISerializer serializer;
private DateTime start = DateTime.Now;
- public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, SForwardServerConfigTransfer sForwardServerConfigTransfer)
+ public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, IRelayServerStore relayServerStore, ISForwardServerStore sForwardServerStore, ISerializer serializer)
{
this.flowTransfer = flowTransfer;
this.messengerFlow = messengerFlow;
this.sForwardFlow = sForwardFlow;
this.relayFlow = relayFlow;
this.signCaching = signCaching;
- this.fileConfig = fileConfig;
- this.relayServerConfigTransfer = relayServerConfigTransfer;
- this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
+ this.relayServerStore = relayServerStore;
+ this.sForwardServerStore = sForwardServerStore;
+ this.serializer = serializer;
}
[MessengerId((ushort)FlowMessengerIds.List)]
@@ -46,22 +44,22 @@ namespace linker.plugins.flow.messenger
Start = start,
Now = DateTime.Now,
};
- connection.Write(Serializer.Serialize(serverFlowInfo));
+ connection.Write(serializer.Serialize(serverFlowInfo));
}
[MessengerId((ushort)FlowMessengerIds.Messenger)]
public void Messenger(IConnection connection)
{
- connection.Write(Serializer.Serialize(messengerFlow.GetFlows()));
+ connection.Write(serializer.Serialize(messengerFlow.GetFlows()));
}
[MessengerId((ushort)FlowMessengerIds.SForward)]
public void SForward(IConnection connection)
{
sForwardFlow.Update();
- SForwardFlowRequestInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ SForwardFlowRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
- if (sForwardServerConfigTransfer.SecretKey == info.SecretKey)
+ if (sForwardServerStore.SecretKey == info.SecretKey)
{
info.GroupId = string.Empty;
}
@@ -77,15 +75,15 @@ namespace linker.plugins.flow.messenger
}
}
- connection.Write(Serializer.Serialize(sForwardFlow.GetFlows(info)));
+ connection.Write(serializer.Serialize(sForwardFlow.GetFlows(info)));
}
[MessengerId((ushort)FlowMessengerIds.Relay)]
public void Relay(IConnection connection)
{
relayFlow.Update();
- RelayFlowRequestInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
- if (relayServerConfigTransfer.SecretKey == info.SecretKey)
+ RelayFlowRequestInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ if (relayServerStore.SecretKey == info.SecretKey)
{
info.GroupId = string.Empty;
}
@@ -101,7 +99,7 @@ namespace linker.plugins.flow.messenger
}
}
- connection.Write(Serializer.Serialize(relayFlow.GetFlows(info)));
+ connection.Write(serializer.Serialize(relayFlow.GetFlows(info)));
}
}
diff --git a/linker/plugins/flow/messenger/FlowMessengerIds.cs b/linker.messenger.flow/messenger/FlowMessengerIds.cs
similarity index 81%
rename from linker/plugins/flow/messenger/FlowMessengerIds.cs
rename to linker.messenger.flow/messenger/FlowMessengerIds.cs
index 36ae15f1..7ba029ca 100644
--- a/linker/plugins/flow/messenger/FlowMessengerIds.cs
+++ b/linker.messenger.flow/messenger/FlowMessengerIds.cs
@@ -1,4 +1,4 @@
-namespace linker.plugins.flow.messenger
+namespace linker.messenger.flow.messenger
{
public enum FlowMessengerIds : ushort
{
diff --git a/linker/plugins/forward/config/Config.cs b/linker.messenger.forward/Config.cs
similarity index 73%
rename from linker/plugins/forward/config/Config.cs
rename to linker.messenger.forward/Config.cs
index 9d6454d8..619dc63e 100644
--- a/linker/plugins/forward/config/Config.cs
+++ b/linker.messenger.forward/Config.cs
@@ -1,22 +1,9 @@
-using LiteDB;
-using MemoryPack;
-using System.Net;
-using System.Text.Json.Serialization;
-
-namespace linker.client.config
+using System.Net;
+namespace linker.messenger.forward
{
- public sealed partial class RunningConfigInfo
- {
- ///
- /// 端口转发配置
- ///
- public List Forwards { get; set; } = new List();
- }
-
///
/// 端口转发配置
///
- [MemoryPackable]
public sealed partial class ForwardInfo
{
public ForwardInfo() { }
@@ -34,7 +21,6 @@ namespace linker.client.config
///
/// 本地绑定IP
///
- [MemoryPackAllowSerialize]
public IPAddress BindIPAddress { get; set; } = IPAddress.Any;
///
/// 本地监听端口
@@ -43,7 +29,6 @@ namespace linker.client.config
///
/// 目标设备服务
///
- [MemoryPackAllowSerialize]
public IPEndPoint TargetEP { get; set; }
///
/// 已启动
@@ -63,8 +48,23 @@ namespace linker.client.config
///
public string TargetMsg { get; set; }
- [JsonIgnore, BsonIgnore, MemoryPackIgnore]
public bool Proxy { get; set; }
}
+
+ public sealed partial class ForwardAddForwardInfo
+ {
+ public string MachineId { get; set; }
+ public ForwardInfo Data { get; set; }
+ }
+ public sealed partial class ForwardRemoveForwardInfo
+ {
+ public string MachineId { get; set; }
+ public uint Id { get; set; }
+ }
+ public sealed partial class ForwardCountInfo
+ {
+ public string MachineId { get; set; }
+ public int Count { get; set; }
+ }
}
diff --git a/linker.messenger.forward/Entry.cs b/linker.messenger.forward/Entry.cs
new file mode 100644
index 00000000..a236cef9
--- /dev/null
+++ b/linker.messenger.forward/Entry.cs
@@ -0,0 +1,57 @@
+using linker.messenger.api;
+using linker.messenger.decenter;
+using linker.messenger.forward.proxy;
+using Microsoft.Extensions.DependencyInjection;
+namespace linker.messenger.forward
+{
+ public static class Entry
+ {
+ public static ServiceCollection AddForwardClient(this ServiceCollection serviceCollection)
+ {
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+
+ serviceCollection.AddSingleton();
+
+
+ serviceCollection.AddSingleton();
+
+ return serviceCollection;
+ }
+ public static ServiceProvider UseForwardClient(this ServiceProvider serviceProvider)
+ {
+ IApiServer apiServer = serviceProvider.GetService();
+ apiServer.AddPlugins(new List { serviceProvider.GetService() });
+
+ ForwardTransfer forwardTransfer = serviceProvider.GetService();
+
+ IMessengerResolver messengerResolver = serviceProvider.GetService();
+ messengerResolver.AddMessenger(new List { serviceProvider.GetService() });
+
+ DecenterClientTransfer decenterClientTransfer = serviceProvider.GetService();
+ decenterClientTransfer.AddDecenters(new List { serviceProvider.GetService() });
+
+ ForwardProxy forwardProxy= serviceProvider.GetService();
+
+ return serviceProvider;
+ }
+
+
+ public static ServiceCollection AddForwardServer(this ServiceCollection serviceCollection)
+ {
+ serviceCollection.AddSingleton();
+
+ return serviceCollection;
+ }
+ public static ServiceProvider UseForwardServer(this ServiceProvider serviceProvider)
+ {
+ IMessengerResolver messengerResolver = serviceProvider.GetService();
+ messengerResolver.AddMessenger(new List { serviceProvider.GetService() });
+
+ return serviceProvider;
+ }
+ }
+}
diff --git a/linker/plugins/forward/ForwardApiController.cs b/linker.messenger.forward/ForwardApiController.cs
similarity index 73%
rename from linker/plugins/forward/ForwardApiController.cs
rename to linker.messenger.forward/ForwardApiController.cs
index cd1942c9..1b36f7d0 100644
--- a/linker/plugins/forward/ForwardApiController.cs
+++ b/linker.messenger.forward/ForwardApiController.cs
@@ -1,42 +1,36 @@
using linker.libs.api;
using linker.libs.extends;
-using linker.client.config;
using System.Net;
using linker.libs;
-using linker.plugins.forward.proxy;
using linker.tunnel.connection;
using System.Collections.Concurrent;
-using linker.plugins.forward.messenger;
-using linker.serializer;
-using linker.plugins.client;
-using linker.plugins.capi;
-using linker.plugins.messenger;
-using linker.config;
-using linker.plugins.access;
-using linker.messenger;
using linker.messenger.signin;
+using linker.messenger.forward.proxy;
+using linker.messenger.api;
-namespace linker.plugins.forward
+namespace linker.messenger.forward
{
- public sealed class ForwardClientApiController : IApiClientController
+ public sealed class ForwardApiController : IApiController
{
private readonly ForwardTransfer forwardTransfer;
private readonly ForwardProxy forwardProxy;
private readonly IMessengerSender messengerSender;
private readonly SignInClientState signInClientState;
- private readonly AccessTransfer accessTransfer;
+ private readonly IAccessStore accessStore;
private readonly ISignInClientStore signInClientStore;
private readonly ForwardDecenter forwardDecenter;
+ private readonly ISerializer serializer;
- public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, AccessTransfer accessTransfer, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter)
+ public ForwardApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, SignInClientState signInClientState, IAccessStore accessStore, ISignInClientStore signInClientStore, ForwardDecenter forwardDecenter, ISerializer serializer)
{
this.forwardTransfer = forwardTransfer;
this.forwardProxy = forwardProxy;
this.messengerSender = messengerSender;
this.signInClientState = signInClientState;
- this.accessTransfer = accessTransfer;
+ this.accessStore = accessStore;
this.signInClientStore = signInClientStore;
this.forwardDecenter = forwardDecenter;
+ this.serializer = serializer;
}
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
@@ -53,7 +47,7 @@ namespace linker.plugins.forward
return new ConnectionListInfo { HashCode = version };
}
- [ClientApiAccessAttribute(ClientApiAccess.TunnelRemove)]
+ [Access(AccessValue.TunnelRemove)]
public void RemoveConnection(ApiControllerParamsInfo param)
{
forwardProxy.RemoveConnection(param.Content);
@@ -91,20 +85,20 @@ namespace linker.plugins.forward
{
if (param.Content == signInClientStore.Id)
{
- if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowSelf) == false) return new List();
+ if (accessStore.HasAccess(AccessValue.ForwardShowSelf) == false) return new List();
return forwardTransfer.Get();
}
- if (accessTransfer.HasAccess(ClientApiAccess.ForwardShowOther) == false) return new List();
+ if (accessStore.HasAccess(AccessValue.ForwardShowOther) == false) return new List();
var resp = await messengerSender.SendReply(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.GetForward,
- Payload = Serializer.Serialize(param.Content)
+ Payload = serializer.Serialize(param.Content)
});
if (resp.Code == MessageResponeCodes.OK)
{
- return Serializer.Deserialize>(resp.Data.Span);
+ return serializer.Deserialize>(resp.Data.Span);
}
return new List();
}
@@ -119,16 +113,16 @@ namespace linker.plugins.forward
ForwardAddForwardInfo info = param.Content.DeJson();
if (info.MachineId == signInClientStore.Id)
{
- if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false;
+ if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
return forwardTransfer.Add(info.Data);
}
- if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false;
+ if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
return await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.AddClientForward,
- Payload = Serializer.Serialize(info)
+ Payload = serializer.Serialize(info)
});
}
@@ -142,16 +136,16 @@ namespace linker.plugins.forward
ForwardRemoveForwardInfo info = param.Content.DeJson();
if (info.MachineId == signInClientStore.Id)
{
- if (accessTransfer.HasAccess(ClientApiAccess.ForwardSelf) == false) return false;
+ if (accessStore.HasAccess(AccessValue.ForwardSelf) == false) return false;
return forwardTransfer.Remove(info.Id);
}
- if (accessTransfer.HasAccess(ClientApiAccess.ForwardOther) == false) return false;
+ if (accessStore.HasAccess(AccessValue.ForwardOther) == false) return false;
return await messengerSender.SendOnly(new MessageRequestWrap
{
Connection = signInClientState.Connection,
MessengerId = (ushort)ForwardMessengerIds.RemoveClientForward,
- Payload = Serializer.Serialize(info)
+ Payload = serializer.Serialize(info)
});
}
}
diff --git a/linker/plugins/forward/ForwardDecenter.cs b/linker.messenger.forward/ForwardDecenter.cs
similarity index 66%
rename from linker/plugins/forward/ForwardDecenter.cs
rename to linker.messenger.forward/ForwardDecenter.cs
index 803a44ac..1fee5522 100644
--- a/linker/plugins/forward/ForwardDecenter.cs
+++ b/linker.messenger.forward/ForwardDecenter.cs
@@ -1,46 +1,48 @@
using linker.libs;
using linker.messenger.decenter;
using linker.messenger.signin;
-using linker.plugins.client;
-using linker.serializer;
using System.Collections.Concurrent;
-namespace linker.plugins.forward
+namespace linker.messenger.forward
{
- public sealed class ForwardDecenter:IDecenter
+ public sealed class ForwardDecenter : IDecenter
{
public string Name => "forward";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
- public ConcurrentDictionary CountDic { get; }= new ConcurrentDictionary();
+ public ConcurrentDictionary CountDic { get; } = new ConcurrentDictionary();
private readonly ISignInClientStore signInClientStore;
private readonly ForwardTransfer forwardTransfer;
- public ForwardDecenter(ISignInClientStore signInClientStore, ForwardTransfer forwardTransfer)
+ private readonly ISerializer serializer;
+ public ForwardDecenter(ISignInClientStore signInClientStore, ForwardTransfer forwardTransfer, ISerializer serializer)
{
this.signInClientStore = signInClientStore;
this.forwardTransfer = forwardTransfer;
+ this.serializer = serializer;
+
forwardTransfer.OnReset += CountDic.Clear;
forwardTransfer.OnChanged += SyncVersion.Add;
+
}
public Memory GetData()
{
- CountInfo info = new CountInfo { MachineId = signInClientStore.Id, Count = forwardTransfer.Count };
+ ForwardCountInfo info = new ForwardCountInfo { MachineId = signInClientStore.Id, Count = forwardTransfer.Count };
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
DataVersion.Add();
- return Serializer.Serialize(info);
+ return serializer.Serialize(info);
}
public void SetData(Memory data)
{
- CountInfo info = Serializer.Deserialize(data.Span);
+ ForwardCountInfo info = serializer.Deserialize(data.Span);
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
DataVersion.Add();
}
public void SetData(List> data)
{
- List list = data.Select(c => Serializer.Deserialize(c.Span)).ToList();
+ List list = data.Select(c => serializer.Deserialize(c.Span)).ToList();
foreach (var info in list)
{
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
diff --git a/linker/plugins/forward/messenger/ForwardMessenger.cs b/linker.messenger.forward/ForwardMessenger.cs
similarity index 81%
rename from linker/plugins/forward/messenger/ForwardMessenger.cs
rename to linker.messenger.forward/ForwardMessenger.cs
index 7a716ea3..b1ab409d 100644
--- a/linker/plugins/forward/messenger/ForwardMessenger.cs
+++ b/linker.messenger.forward/ForwardMessenger.cs
@@ -1,21 +1,19 @@
-using linker.client.config;
-using linker.messenger;
+using linker.libs;
using linker.messenger.signin;
-using linker.serializer;
-using MemoryPack;
-namespace linker.plugins.forward.messenger
+namespace linker.messenger.forward
{
public sealed class ForwardServerMessenger : IMessenger
{
private readonly IMessengerSender sender;
private readonly SignInServerCaching signCaching;
-
- public ForwardServerMessenger(IMessengerSender sender, SignInServerCaching signCaching)
+ private readonly ISerializer serializer;
+ public ForwardServerMessenger(IMessengerSender sender, SignInServerCaching signCaching, ISerializer serializer)
{
this.sender = sender;
this.signCaching = signCaching;
+ this.serializer = serializer;
}
///
@@ -25,7 +23,7 @@ namespace linker.plugins.forward.messenger
[MessengerId((ushort)ForwardMessengerIds.GetForward)]
public void GetForward(IConnection connection)
{
- string machineId = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ string machineId = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(machineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
@@ -56,7 +54,7 @@ namespace linker.plugins.forward.messenger
[MessengerId((ushort)ForwardMessengerIds.AddClientForward)]
public async Task AddClientForward(IConnection connection)
{
- ForwardAddForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ ForwardAddForwardInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
@@ -64,7 +62,7 @@ namespace linker.plugins.forward.messenger
{
Connection = cacheTo.Connection,
MessengerId = (ushort)ForwardMessengerIds.AddClient,
- Payload = Serializer.Serialize(info.Data)
+ Payload = serializer.Serialize(info.Data)
});
}
}
@@ -75,7 +73,7 @@ namespace linker.plugins.forward.messenger
[MessengerId((ushort)ForwardMessengerIds.RemoveClientForward)]
public async Task RemoveClientForward(IConnection connection)
{
- ForwardRemoveForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ ForwardRemoveForwardInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
if (signCaching.TryGet(info.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
{
uint requestid = connection.ReceiveRequestWrap.RequestId;
@@ -83,7 +81,7 @@ namespace linker.plugins.forward.messenger
{
Connection = cacheTo.Connection,
MessengerId = (ushort)ForwardMessengerIds.RemoveClient,
- Payload = Serializer.Serialize(info.Id)
+ Payload = serializer.Serialize(info.Id)
});
}
}
@@ -94,17 +92,18 @@ namespace linker.plugins.forward.messenger
{
private readonly ForwardTransfer forwardTransfer;
private readonly IMessengerSender sender;
-
- public ForwardClientMessenger(ForwardTransfer forwardTransfer, IMessengerSender sender)
+ private readonly ISerializer serializer;
+ public ForwardClientMessenger(ForwardTransfer forwardTransfer, IMessengerSender sender, ISerializer serializer)
{
this.forwardTransfer = forwardTransfer;
this.sender = sender;
+ this.serializer = serializer;
}
[MessengerId((ushort)ForwardMessengerIds.Get)]
public void Get(IConnection connection)
{
- connection.Write(Serializer.Serialize(forwardTransfer.Get()));
+ connection.Write(serializer.Serialize(forwardTransfer.Get()));
}
///
/// 添加
@@ -113,7 +112,7 @@ namespace linker.plugins.forward.messenger
[MessengerId((ushort)ForwardMessengerIds.AddClient)]
public void AddClient(IConnection connection)
{
- ForwardInfo info = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ ForwardInfo info = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
forwardTransfer.Add(info);
}
//
@@ -123,21 +122,10 @@ namespace linker.plugins.forward.messenger
[MessengerId((ushort)ForwardMessengerIds.RemoveClient)]
public void RemoveClient(IConnection connection)
{
- uint id = Serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
+ uint id = serializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span);
forwardTransfer.Remove(id);
}
}
- [MemoryPackable]
- public sealed partial class ForwardAddForwardInfo
- {
- public string MachineId { get; set; }
- public ForwardInfo Data { get; set; }
- }
- [MemoryPackable]
- public sealed partial class ForwardRemoveForwardInfo
- {
- public string MachineId { get; set; }
- public uint Id { get; set; }
- }
+
}
diff --git a/linker/plugins/forward/messenger/ForwardMessengerIds.cs b/linker.messenger.forward/ForwardMessengerIds.cs
similarity index 87%
rename from linker/plugins/forward/messenger/ForwardMessengerIds.cs
rename to linker.messenger.forward/ForwardMessengerIds.cs
index e8df76f2..d232b590 100644
--- a/linker/plugins/forward/messenger/ForwardMessengerIds.cs
+++ b/linker.messenger.forward/ForwardMessengerIds.cs
@@ -1,4 +1,4 @@
-namespace linker.plugins.forward.messenger
+namespace linker.messenger.forward
{
public enum ForwardMessengerIds : ushort
{
diff --git a/linker/plugins/forward/ForwardTransfer.cs b/linker.messenger.forward/ForwardTransfer.cs
similarity index 70%
rename from linker/plugins/forward/ForwardTransfer.cs
rename to linker.messenger.forward/ForwardTransfer.cs
index fa808953..fa5f2c10 100644
--- a/linker/plugins/forward/ForwardTransfer.cs
+++ b/linker.messenger.forward/ForwardTransfer.cs
@@ -1,20 +1,17 @@
-using linker.client.config;
-using linker.libs;
-using linker.messenger;
+using linker.libs;
+using linker.libs.extends;
+using linker.messenger.forward.proxy;
using linker.messenger.signin;
-using linker.plugins.client;
-using linker.plugins.forward.proxy;
-using MemoryPack;
-namespace linker.plugins.forward
+namespace linker.messenger.forward
{
public sealed class ForwardTransfer
{
- public int Count => running.Data.Forwards.Count(c => c.GroupId == signInClientStore.Group.Id);
+ public int Count => forwardClientStore.Get().Count(c => c.GroupId == signInClientStore.Group.Id);
public Action OnChanged { get; set; } = () => { };
- public Action OnReset{ get; set; } = () => { };
+ public Action OnReset { get; set; } = () => { };
- private readonly RunningConfig running;
+ private readonly IForwardClientStore forwardClientStore;
private readonly ForwardProxy forwardProxy;
private readonly SignInClientState signInClientState;
private readonly IMessengerSender messengerSender;
@@ -22,9 +19,9 @@ namespace linker.plugins.forward
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
- public ForwardTransfer( RunningConfig running, ForwardProxy forwardProxy, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore)
+ public ForwardTransfer(IForwardClientStore forwardClientStore, ForwardProxy forwardProxy, SignInClientState signInClientState, IMessengerSender messengerSender, ISignInClientStore signInClientStore)
{
- this.running = running;
+ this.forwardClientStore = forwardClientStore;
this.forwardProxy = forwardProxy;
this.signInClientState = signInClientState;
this.messengerSender = messengerSender;
@@ -38,15 +35,6 @@ namespace linker.plugins.forward
{
TimerHelper.Async(async () =>
{
- if (running.Data.Forwards.All(c => string.IsNullOrWhiteSpace(c.GroupId)))
- {
- foreach (var item in running.Data.Forwards)
- {
- item.GroupId = signInClientStore.Group.Id;
- }
- running.Data.Update();
- }
-
if (groupid != signInClientStore.Group.Id)
{
OnReset();
@@ -58,15 +46,15 @@ namespace linker.plugins.forward
Start(false);
});
}
-
+
private void Start(bool errorStop = true)
{
lock (this)
{
- uint maxid = running.Data.Forwards.Count > 0 ? running.Data.Forwards.Max(c => c.Id) : 1;
+ uint maxid = forwardClientStore.Count() > 0 ? forwardClientStore.Get().Max(c => c.Id) : 1;
ns.Reset(maxid);
- foreach (var item in running.Data.Forwards.Where(c => c.GroupId == signInClientStore.Group.Id))
+ foreach (var item in forwardClientStore.Get(signInClientStore.Group.Id))
{
if (item.Started)
{
@@ -76,7 +64,9 @@ namespace linker.plugins.forward
{
Stop(item);
}
+ forwardClientStore.Update(item);
}
+ forwardClientStore.Confirm();
OnChanged();
}
}
@@ -124,7 +114,7 @@ namespace linker.plugins.forward
{
lock (this)
{
- foreach (var item in running.Data.Forwards)
+ foreach (var item in forwardClientStore.Get())
{
Stop(item);
}
@@ -136,7 +126,8 @@ namespace linker.plugins.forward
{
if (forwardInfo.Proxy)
{
- LoggerHelper.Instance.Debug($"stop forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP}");
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Debug($"stop forward {forwardInfo.ToJson()}");
forwardProxy.StopPort(forwardInfo.Port);
forwardInfo.Proxy = false;
}
@@ -150,19 +141,22 @@ namespace linker.plugins.forward
public List Get()
{
- return running.Data.Forwards.Where(c => c.GroupId == signInClientStore.Group.Id).ToList();
+ return forwardClientStore.Get(signInClientStore.Group.Id);
}
public bool Add(ForwardInfo forwardInfo)
{
//同名或者同端口,但是ID不一样
- ForwardInfo old = running.Data.Forwards.FirstOrDefault(c => (c.Port == forwardInfo.Port && c.Port != 0) && c.MachineId == forwardInfo.MachineId);
+ ForwardInfo old = forwardClientStore.Get().FirstOrDefault(c => (c.Port == forwardInfo.Port && c.Port != 0) && c.MachineId == forwardInfo.MachineId);
if (old != null && old.Id != forwardInfo.Id) return false;
if (forwardInfo.Id != 0)
{
- old = running.Data.Forwards.FirstOrDefault(c => c.Id == forwardInfo.Id);
+ old = forwardClientStore.Get(forwardInfo.Id);
if (old == null) return false;
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Debug($"update forward {old.ToJson()}->{forwardInfo.ToJson()}");
+
old.BindIPAddress = forwardInfo.BindIPAddress;
old.Port = forwardInfo.Port;
old.Name = forwardInfo.Name;
@@ -177,9 +171,13 @@ namespace linker.plugins.forward
{
forwardInfo.Id = ns.Increment();
forwardInfo.GroupId = signInClientStore.Group.Id;
- running.Data.Forwards.Add(forwardInfo);
+
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Debug($"add forward {forwardInfo.ToJson()}");
+
+ forwardClientStore.Add(forwardInfo);
}
- running.Data.Update();
+ forwardClientStore.Confirm();
Start();
@@ -188,24 +186,19 @@ namespace linker.plugins.forward
public bool Remove(uint id)
{
//同名或者同端口,但是ID不一样
- ForwardInfo old = running.Data.Forwards.FirstOrDefault(c => c.Id == id);
+ ForwardInfo old = forwardClientStore.Get(id);
if (old == null) return false;
old.Started = false;
- running.Data.Forwards.Remove(old);
- running.Data.Update();
+ forwardClientStore.Remove(old.Id);
+
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Debug($"remove forward {old.ToJson()}");
Start();
-
+ forwardClientStore.Confirm();
return true;
}
}
-
- [MemoryPackable]
- public sealed partial class CountInfo
- {
- public string MachineId { get; set; }
- public int Count { get; set; }
- }
}
diff --git a/linker.messenger.forward/IForwardClientStore.cs b/linker.messenger.forward/IForwardClientStore.cs
new file mode 100644
index 00000000..a3f873c7
--- /dev/null
+++ b/linker.messenger.forward/IForwardClientStore.cs
@@ -0,0 +1,16 @@
+namespace linker.messenger.forward
+{
+ public interface IForwardClientStore
+ {
+ public int Count();
+
+ public List Get();
+ public ForwardInfo Get(uint id);
+ public List Get(string groupId);
+ public bool Add(ForwardInfo info);
+ public bool Update(ForwardInfo info);
+ public bool Remove(uint id);
+
+ public bool Confirm();
+ }
+}
diff --git a/linker.messenger.forward/linker.messenger.forward.csproj b/linker.messenger.forward/linker.messenger.forward.csproj
new file mode 100644
index 00000000..bd304813
--- /dev/null
+++ b/linker.messenger.forward/linker.messenger.forward.csproj
@@ -0,0 +1,41 @@
+
+
+
+
+ net8.0
+ enable
+ disable
+ true
+ false
+ true
+ True
+ linker messenger forward
+ snltty
+ snltty
+ linker messenger forward
+ snltty
+ https://github.com/snltty/linker
+ https://github.com/snltty/linker
+ linker messenger forward
+ 1.6.4
+ 1.6.4
+ 1.6.4
+
+
+
+ full
+ true
+
+
+ none
+ false
+ True
+
+
+
+
+
+
+
+
+
diff --git a/linker/plugins/forward/proxy/ForwardProxy.cs b/linker.messenger.forward/proxy/ForwardProxy.cs
similarity index 99%
rename from linker/plugins/forward/proxy/ForwardProxy.cs
rename to linker.messenger.forward/proxy/ForwardProxy.cs
index 654488f5..666808ca 100644
--- a/linker/plugins/forward/proxy/ForwardProxy.cs
+++ b/linker.messenger.forward/proxy/ForwardProxy.cs
@@ -5,7 +5,7 @@ using System.Buffers;
using System.Net;
using System.Net.Sockets;
-namespace linker.plugins.forward.proxy
+namespace linker.messenger.forward.proxy
{
public partial class ForwardProxy
diff --git a/linker/plugins/forward/proxy/ForwardProxyTcp.cs b/linker.messenger.forward/proxy/ForwardProxyTcp.cs
similarity index 99%
rename from linker/plugins/forward/proxy/ForwardProxyTcp.cs
rename to linker.messenger.forward/proxy/ForwardProxyTcp.cs
index 20d99112..5e5fde4a 100644
--- a/linker/plugins/forward/proxy/ForwardProxyTcp.cs
+++ b/linker.messenger.forward/proxy/ForwardProxyTcp.cs
@@ -6,7 +6,7 @@ using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
-namespace linker.plugins.forward.proxy
+namespace linker.messenger.forward.proxy
{
public partial class ForwardProxy
{
diff --git a/linker/plugins/forward/proxy/ForwardProxyTunnel.cs b/linker.messenger.forward/proxy/ForwardProxyTunnel.cs
similarity index 94%
rename from linker/plugins/forward/proxy/ForwardProxyTunnel.cs
rename to linker.messenger.forward/proxy/ForwardProxyTunnel.cs
index 74ddf82c..df900986 100644
--- a/linker/plugins/forward/proxy/ForwardProxyTunnel.cs
+++ b/linker.messenger.forward/proxy/ForwardProxyTunnel.cs
@@ -2,16 +2,14 @@
using linker.tunnel.connection;
using System.Collections.Concurrent;
using System.Net;
-using linker.plugins.client;
-using linker.plugins.tunnel;
-using linker.plugins.relay.client;
-using linker.plugins.pcp;
using linker.messenger.relay.client;
using linker.messenger.signin;
+using linker.messenger.channel;
+using linker.messenger.pcp;
-namespace linker.plugins.forward.proxy
+namespace linker.messenger.forward.proxy
{
- public sealed partial class ForwardProxy : TunnelBase, ITunnelConnectionReceiveCallback
+ public sealed partial class ForwardProxy : Channel, ITunnelConnectionReceiveCallback
{
private readonly ConcurrentDictionary caches = new ConcurrentDictionary();
private readonly ConcurrentDictionary locks = new ConcurrentDictionary();
@@ -19,8 +17,8 @@ namespace linker.plugins.forward.proxy
protected override string TransactionId => "forward";
- public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
- : base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientConfigTransfer)
+ public ForwardProxy(ISignInClientStore signInClientStore, TunnelTransfer tunnelTransfer, RelayClientTransfer relayTransfer, PcpTransfer pcpTransfer, SignInClientTransfer signInClientTransfer, IRelayClientStore relayClientStore)
+ : base(tunnelTransfer, relayTransfer, pcpTransfer, signInClientTransfer, signInClientStore, relayClientStore)
{
TaskUdp();
}
diff --git a/linker/plugins/forward/proxy/ForwardProxyUdp.cs b/linker.messenger.forward/proxy/ForwardProxyUdp.cs
similarity index 99%
rename from linker/plugins/forward/proxy/ForwardProxyUdp.cs
rename to linker.messenger.forward/proxy/ForwardProxyUdp.cs
index abf07aa1..e916c360 100644
--- a/linker/plugins/forward/proxy/ForwardProxyUdp.cs
+++ b/linker.messenger.forward/proxy/ForwardProxyUdp.cs
@@ -5,7 +5,7 @@ using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
-namespace linker.plugins.forward.proxy
+namespace linker.messenger.forward.proxy
{
public partial class ForwardProxy
{
diff --git a/linker.messenger.listen/Entry.cs b/linker.messenger.listen/Entry.cs
index 3f925582..893c3186 100644
--- a/linker.messenger.listen/Entry.cs
+++ b/linker.messenger.listen/Entry.cs
@@ -1,6 +1,5 @@
using linker.libs;
using Microsoft.Extensions.DependencyInjection;
-using System.Security.Cryptography.X509Certificates;
namespace linker.messenger.listen
{
public static class Entry
@@ -10,7 +9,7 @@ namespace linker.messenger.listen
serviceCollection.AddSingleton();
return serviceCollection;
}
- public static ServiceProvider UseListen(this ServiceProvider serviceProvider, X509Certificate2 certificate)
+ public static ServiceProvider UseListen(this ServiceProvider serviceProvider)
{
TcpServer tcpServer = serviceProvider.GetService();
IListenStore listenStore = serviceProvider.GetService();
diff --git a/linker.messenger.logger/Entry.cs b/linker.messenger.logger/Entry.cs
new file mode 100644
index 00000000..ec5e81dd
--- /dev/null
+++ b/linker.messenger.logger/Entry.cs
@@ -0,0 +1,90 @@
+using linker.libs;
+using linker.messenger.api;
+using Microsoft.Extensions.DependencyInjection;
+namespace linker.messenger.logger
+{
+ public static class Entry
+ {
+ public static ServiceCollection AddLoggerClient(this ServiceCollection serviceCollection)
+ {
+ LoggerConsole();
+ serviceCollection.AddSingleton();
+ return serviceCollection;
+ }
+ public static ServiceProvider UseLoggerClient(this ServiceProvider serviceProvider)
+ {
+ IApiServer apiServer = serviceProvider.GetService();
+ apiServer.AddPlugins(new List { serviceProvider.GetService() });
+
+ IAccessStore accessStore= serviceProvider.GetService();
+ ILoggerStore loggerStore= serviceProvider.GetService();
+ if (accessStore.HasAccess(AccessValue.LoggerLevel) == false)
+ {
+ loggerStore.SetLevel( libs.LoggerTypes.WARNING);
+ loggerStore.Confirm();
+ }
+
+ return serviceProvider;
+ }
+
+
+ private static void LoggerConsole()
+ {
+ if (Directory.Exists("logs") == false)
+ {
+ Directory.CreateDirectory("logs");
+ }
+ LoggerHelper.Instance.OnLogger += (model) =>
+ {
+ ConsoleColor currentForeColor = Console.ForegroundColor;
+ switch (model.Type)
+ {
+ case LoggerTypes.DEBUG:
+ Console.ForegroundColor = ConsoleColor.Blue;
+ break;
+ case LoggerTypes.INFO:
+ Console.ForegroundColor = ConsoleColor.White;
+ break;
+ case LoggerTypes.WARNING:
+ Console.ForegroundColor = ConsoleColor.Yellow;
+ break;
+ case LoggerTypes.ERROR:
+ Console.ForegroundColor = ConsoleColor.Red;
+ break;
+ default:
+ break;
+ }
+ string line = $"[{model.Type,-7}][{model.Time:yyyy-MM-dd HH:mm:ss}]:{model.Content}";
+ Console.WriteLine(line);
+ Console.ForegroundColor = currentForeColor;
+ try
+ {
+ using StreamWriter sw = File.AppendText(Path.Combine("logs", $"{DateTime.Now:yyyy-MM-dd}.log"));
+ sw.WriteLine(line);
+ sw.Flush();
+ sw.Close();
+ sw.Dispose();
+ }
+ catch (Exception)
+ {
+ }
+ };
+ TimerHelper.SetInterval(() =>
+ {
+ string[] files = Directory.GetFiles("logs").OrderBy(c => c).ToArray();
+ for (int i = 0; i < files.Length - 180; i++)
+ {
+ try
+ {
+ File.Delete(files[i]);
+ }
+ catch (Exception)
+ {
+ }
+ }
+ return true;
+ }, 60 * 1000);
+ }
+
+ }
+}
diff --git a/linker.messenger.logger/ILoggerStore.cs b/linker.messenger.logger/ILoggerStore.cs
new file mode 100644
index 00000000..3ef605ac
--- /dev/null
+++ b/linker.messenger.logger/ILoggerStore.cs
@@ -0,0 +1,15 @@
+using linker.libs;
+
+namespace linker.messenger.logger
+{
+ public interface ILoggerStore
+ {
+ public LoggerTypes LoggerType { get; }
+ public int LoggerSize { get; }
+
+ public bool SetLevel(LoggerTypes level);
+ public bool SetSize(int size);
+
+ public bool Confirm();
+ }
+}
diff --git a/linker/plugins/logger/LoggerController.cs b/linker.messenger.logger/LoggerController.cs
similarity index 74%
rename from linker/plugins/logger/LoggerController.cs
rename to linker.messenger.logger/LoggerController.cs
index 8a4438fc..1f166be0 100644
--- a/linker/plugins/logger/LoggerController.cs
+++ b/linker.messenger.logger/LoggerController.cs
@@ -1,30 +1,28 @@
using linker.libs.extends;
using linker.libs.api;
using linker.libs;
-using linker.config;
-using linker.plugins.capi;
+using linker.messenger.api;
-namespace linker.plugins.logger
+namespace linker.messenger.logger
{
- public sealed class LoggerClientApiController : IApiClientController
+ public sealed class LoggerApiController : IApiController
{
private readonly List loggers = new List();
-
- private readonly FileConfig config;
- public LoggerClientApiController(FileConfig config)
+ private readonly ILoggerStore loggerStore;
+ public LoggerApiController(ILoggerStore loggerStore)
{
- this.config = config;
+ this.loggerStore = loggerStore;
LoggerHelper.Instance.OnLogger += (LoggerModel logger) =>
{
loggers.Add(logger);
- if (loggers.Count > config.Data.Common.LoggerSize)
+ if (loggers.Count > loggerStore.LoggerSize)
{
loggers.RemoveAt(0);
}
};
}
- [ClientApiAccessAttribute(ClientApiAccess.LoggerShow)]
+ [Access(AccessValue.LoggerShow)]
public LoggerPageInfo Get(ApiControllerParamsInfo param)
{
LoggerPageParamInfo info = param.Content.DeJson();
@@ -55,18 +53,18 @@ namespace linker.plugins.logger
{
return new LoggerSetParamInfo
{
- LoggerType = config.Data.Common.LoggerType,
- Size = config.Data.Common.LoggerSize
+ LoggerType = loggerStore.LoggerType,
+ Size = loggerStore.LoggerSize
};
}
- [ClientApiAccessAttribute(ClientApiAccess.LoggerLevel)]
+ [Access(AccessValue.LoggerLevel)]
public bool SetConfig(ApiControllerParamsInfo param)
{
LoggerSetParamInfo info = param.Content.DeJson();
- config.Data.Common.LoggerSize = info.Size;
- config.Data.Common.LoggerType = info.LoggerType;
- config.Data.Update();
+ loggerStore.SetLevel(info.LoggerType);
+ loggerStore.SetSize(info.Size);
+ loggerStore.Confirm();
return true;
}
diff --git a/linker.messenger.logger/linker.messenger.logger.csproj b/linker.messenger.logger/linker.messenger.logger.csproj
new file mode 100644
index 00000000..fb09b156
--- /dev/null
+++ b/linker.messenger.logger/linker.messenger.logger.csproj
@@ -0,0 +1,38 @@
+
+
+
+ net8.0
+ enable
+ disable
+ true
+ false
+ true
+ True
+ linker messenger logger
+ snltty
+ snltty
+ linker messenger logger
+ snltty
+ https://github.com/snltty/linker
+ https://github.com/snltty/linker
+ linker messenger logger
+ 1.6.4
+ 1.6.4
+ 1.6.4
+
+
+
+ full
+ true
+
+
+ none
+ false
+ True
+
+
+
+
+
+
+
diff --git a/linker.messenger.pcp/Entry.cs b/linker.messenger.pcp/Entry.cs
index 3bae3047..34e2543e 100644
--- a/linker.messenger.pcp/Entry.cs
+++ b/linker.messenger.pcp/Entry.cs
@@ -3,13 +3,13 @@ namespace linker.messenger.pcp
{
public static class Entry
{
- public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection)
+ public static ServiceCollection AddPcpClient(this ServiceCollection serviceCollection)
{
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
return serviceCollection;
}
- public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider)
+ public static ServiceProvider UsePcpClient(this ServiceProvider serviceProvider)
{
IMessengerResolver messengerResolver = serviceProvider.GetService();
messengerResolver.AddMessenger(new List { serviceProvider.GetService() });
@@ -17,12 +17,12 @@ namespace linker.messenger.pcp
}
- public static ServiceCollection AddRelayServer(this ServiceCollection serviceCollection)
+ public static ServiceCollection AddPcpServer(this ServiceCollection serviceCollection)
{
serviceCollection.AddSingleton();
return serviceCollection;
}
- public static ServiceProvider UseRelayServer(this ServiceProvider serviceProvider)
+ public static ServiceProvider UsePcpServer(this ServiceProvider serviceProvider)
{
IMessengerResolver messengerResolver = serviceProvider.GetService();
messengerResolver.AddMessenger(new List { serviceProvider.GetService() });
diff --git a/linker.messenger.relay/Entry.cs b/linker.messenger.relay/Entry.cs
index c9135dd6..5399b0fc 100644
--- a/linker.messenger.relay/Entry.cs
+++ b/linker.messenger.relay/Entry.cs
@@ -6,12 +6,10 @@ using linker.messenger.relay.server.caching;
using linker.messenger.relay.server.validator;
using linker.messenger.sync;
using Microsoft.Extensions.DependencyInjection;
-using System.Security.Cryptography.X509Certificates;
namespace linker.messenger.relay
{
public static class Entry
{
- public static X509Certificate2 certificate;
public static ServiceCollection AddRelayClient(this ServiceCollection serviceCollection)
{
serviceCollection.AddSingleton();
@@ -25,10 +23,8 @@ namespace linker.messenger.relay
return serviceCollection;
}
- public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider, X509Certificate2 certificate)
+ public static ServiceProvider UseRelayClient(this ServiceProvider serviceProvider)
{
- Entry.certificate = certificate;
-
IMessengerResolver messengerResolver = serviceProvider.GetService();
messengerResolver.AddMessenger(new List { serviceProvider.GetService() });
diff --git a/linker.messenger.relay/client/RelayApiController.cs b/linker.messenger.relay/client/RelayApiController.cs
index 47897d63..c467ffa0 100644
--- a/linker.messenger.relay/client/RelayApiController.cs
+++ b/linker.messenger.relay/client/RelayApiController.cs
@@ -1,5 +1,6 @@
using linker.libs.api;
using linker.libs.extends;
+using linker.messenger.api;
using linker.messenger.relay.client;
using linker.messenger.relay.client.transport;
using linker.messenger.relay.server;
@@ -27,6 +28,7 @@ namespace linker.messenger.relay
///
///
///
+ [Access(AccessValue.Config)]
public bool SetServers(ApiControllerParamsInfo param)
{
RelayServerInfo info = param.Content.DeJson();
diff --git a/linker.messenger.relay/client/RelayClientTransfer.cs b/linker.messenger.relay/client/RelayClientTransfer.cs
index a8a5b3be..cdcd12e7 100644
--- a/linker.messenger.relay/client/RelayClientTransfer.cs
+++ b/linker.messenger.relay/client/RelayClientTransfer.cs
@@ -18,11 +18,11 @@ namespace linker.messenger.relay.client
private Dictionary>> OnConnected { get; } = new Dictionary>>();
private readonly IRelayClientStore relayClientStore;
- public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore,SignInClientState signInClientState)
+ public RelayClientTransfer(IMessengerSender messengerSender,ISerializer serializer,IRelayClientStore relayClientStore,SignInClientState signInClientState,IMessengerStore messengerStore)
{
this.relayClientStore = relayClientStore;
Transports = new List {
- new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState),
+ new RelayClientTransportSelfHost(messengerSender,serializer,relayClientStore,signInClientState,messengerStore),
};
LoggerHelper.Instance.Info($"load relay transport:{string.Join(",", Transports.Select(c => c.GetType().Name))}");
}
diff --git a/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs b/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs
index ac5e46a6..99101eef 100644
--- a/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs
+++ b/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs
@@ -27,12 +27,14 @@ namespace linker.messenger.relay.client.transport
private readonly ISerializer serializer;
private readonly IRelayClientStore relayClientStore;
private readonly SignInClientState signInClientState;
- public RelayClientTransportSelfHost(IMessengerSender messengerSender, ISerializer serializer, IRelayClientStore relayClientStore, SignInClientState signInClientState)
+ private readonly IMessengerStore messengerStore;
+ public RelayClientTransportSelfHost(IMessengerSender messengerSender, ISerializer serializer, IRelayClientStore relayClientStore, SignInClientState signInClientState, IMessengerStore messengerStore)
{
this.messengerSender = messengerSender;
this.serializer = serializer;
this.relayClientStore = relayClientStore;
this.signInClientState = signInClientState;
+ this.messengerStore = messengerStore;
}
public async Task RelayAsync(RelayInfo relayInfo)
@@ -272,7 +274,7 @@ namespace linker.messenger.relay.client.transport
if (relayInfo.SSL)
{
sslStream = new SslStream(new NetworkStream(socket, false), false);
- await sslStream.AuthenticateAsServerAsync(Entry.certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
+ await sslStream.AuthenticateAsServerAsync(messengerStore.Certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
}
return new TunnelConnectionTcp
{
diff --git a/linker.messenger.relay/server/IRelayServerNodeStore.cs b/linker.messenger.relay/server/IRelayServerNodeStore.cs
index 6a01f299..b6ce2bf0 100644
--- a/linker.messenger.relay/server/IRelayServerNodeStore.cs
+++ b/linker.messenger.relay/server/IRelayServerNodeStore.cs
@@ -48,12 +48,12 @@ namespace linker.messenger.relay.server
}
}
- private string name = Dns.GetHostName().SubStr(0, 12);
+ private string name = Dns.GetHostName().SubStr(0, 32);
public string Name
{
get => name; set
{
- name = value.SubStr(0, 12);
+ name = value.SubStr(0, 32);
}
}
public string Host { get; set; } = string.Empty;
diff --git a/linker.messenger.serializer.memorypack/AccessSerializer.cs b/linker.messenger.serializer.memorypack/AccessSerializer.cs
index 3315872f..02bbc519 100644
--- a/linker.messenger.serializer.memorypack/AccessSerializer.cs
+++ b/linker.messenger.serializer.memorypack/AccessSerializer.cs
@@ -1,5 +1,6 @@
using MemoryPack;
using linker.messenger.access;
+using linker.messenger.api;
namespace linker.messenger.serializer.memorypack
{
diff --git a/linker.messenger.serializer.memorypack/Entry.cs b/linker.messenger.serializer.memorypack/Entry.cs
index a1fd44dc..471b14b5 100644
--- a/linker.messenger.serializer.memorypack/Entry.cs
+++ b/linker.messenger.serializer.memorypack/Entry.cs
@@ -59,6 +59,39 @@ namespace linker.messenger.serializer.memorypack
MemoryPackFormatterProvider.Register(new Socks5LanInfoFormatter());
MemoryPackFormatterProvider.Register(new Socks5InfoFormatter());
+
+ MemoryPackFormatterProvider.Register(new SForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardAddInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardAddResultInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardAddForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardRemoveForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardProxyInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardCountInfoFormatter());
+
+
+ MemoryPackFormatterProvider.Register(new ForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new ForwardAddForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new ForwardRemoveForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new ForwardCountInfoFormatter());
+
+ MemoryPackFormatterProvider.Register(new FlowItemInfoFormatter());
+ MemoryPackFormatterProvider.Register(new FlowInfoFormatter());
+ MemoryPackFormatterProvider.Register(new RelayFlowItemInfoFormatter());
+ MemoryPackFormatterProvider.Register(new RelayFlowRequestInfoFormatter());
+ MemoryPackFormatterProvider.Register(new RelayFlowResponseInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardFlowItemInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardFlowRequestInfoFormatter());
+ MemoryPackFormatterProvider.Register(new SForwardFlowResponseInfoFormatter());
+
+ MemoryPackFormatterProvider.Register(new TuntapVeaLanIPAddressFormatter());
+ MemoryPackFormatterProvider.Register(new TuntapVeaLanIPAddressListFormatter());
+ MemoryPackFormatterProvider.Register(new TuntapInfoFormatter());
+ MemoryPackFormatterProvider.Register(new TuntapForwardInfoFormatter());
+ MemoryPackFormatterProvider.Register(new TuntapForwardTestWrapInfoFormatter());
+ MemoryPackFormatterProvider.Register(new TuntapForwardTestInfoFormatter());
+ MemoryPackFormatterProvider.Register(new TuntapLanInfoFormatter());
+ MemoryPackFormatterProvider.Register(new LeaseInfoFormatter());
+
return serviceCollection;
}
public static ServiceProvider UseSerializerMemoryPack(this ServiceProvider serviceProvider)
diff --git a/linker.messenger.serializer.memorypack/FlowSerializer.cs b/linker.messenger.serializer.memorypack/FlowSerializer.cs
new file mode 100644
index 00000000..8717ea58
--- /dev/null
+++ b/linker.messenger.serializer.memorypack/FlowSerializer.cs
@@ -0,0 +1,533 @@
+using MemoryPack;
+using linker.messenger.flow;
+
+namespace linker.messenger.serializer.memorypack
+{
+ [MemoryPackable]
+ public readonly partial struct SerializableFlowItemInfo
+ {
+ [MemoryPackIgnore]
+ public readonly FlowItemInfo info;
+
+ [MemoryPackInclude]
+ ulong ReceiveBytes => info.ReceiveBytes;
+
+ [MemoryPackInclude]
+ ulong SendtBytes => info.SendtBytes;
+
+ [MemoryPackConstructor]
+ SerializableFlowItemInfo(ulong receiveBytes, ulong sendtBytes)
+ {
+ var info = new FlowItemInfo { ReceiveBytes = receiveBytes, SendtBytes = sendtBytes };
+ this.info = info;
+ }
+
+ public SerializableFlowItemInfo(FlowItemInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class FlowItemInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref FlowItemInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableFlowItemInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref FlowItemInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableFlowInfo
+ {
+ [MemoryPackIgnore]
+ public readonly FlowInfo info;
+
+ [MemoryPackInclude]
+ Dictionary Items => info.Items;
+
+ [MemoryPackInclude]
+ DateTime Start => info.Start;
+
+ [MemoryPackInclude]
+ DateTime Now => info.Now;
+
+ [MemoryPackConstructor]
+ SerializableFlowInfo(Dictionary items, DateTime start, DateTime now)
+ {
+ var info = new FlowInfo { Items = items, Now = now, Start = start };
+ this.info = info;
+ }
+
+ public SerializableFlowInfo(FlowInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class FlowInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref FlowInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableFlowInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref FlowInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableRelayFlowItemInfo
+ {
+ [MemoryPackIgnore]
+ public readonly RelayFlowItemInfo info;
+
+ [MemoryPackInclude]
+ ulong ReceiveBytes => info.ReceiveBytes;
+
+ [MemoryPackInclude]
+ ulong SendtBytes => info.SendtBytes;
+
+ [MemoryPackInclude]
+ ulong DiffReceiveBytes => info.DiffReceiveBytes;
+
+ [MemoryPackInclude]
+ ulong DiffSendtBytes => info.DiffSendtBytes;
+
+ [MemoryPackInclude]
+ string FromName => info.FromName;
+
+ [MemoryPackInclude]
+ string ToName => info.ToName;
+
+ [MemoryPackConstructor]
+ SerializableRelayFlowItemInfo(ulong receiveBytes, ulong sendtBytes, ulong diffReceiveBytes, ulong diffSendtBytes, string fromName, string toName)
+ {
+ var info = new RelayFlowItemInfo
+ {
+ ReceiveBytes = receiveBytes,
+ SendtBytes = sendtBytes,
+ DiffReceiveBytes = diffReceiveBytes,
+ DiffSendtBytes = diffSendtBytes,
+ FromName = fromName,
+ ToName = toName
+ };
+ this.info = info;
+ }
+
+ public SerializableRelayFlowItemInfo(RelayFlowItemInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class RelayFlowItemInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayFlowItemInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableRelayFlowItemInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayFlowItemInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableRelayFlowRequestInfo
+ {
+ [MemoryPackIgnore]
+ public readonly RelayFlowRequestInfo info;
+
+ [MemoryPackInclude]
+ string Key => info.Key;
+
+ [MemoryPackInclude]
+ string SecretKey => info.SecretKey;
+
+ [MemoryPackInclude]
+ int Page => info.Page;
+
+ [MemoryPackInclude]
+ int PageSize => info.PageSize;
+
+ [MemoryPackInclude]
+ RelayFlowOrder Order => info.Order;
+
+ [MemoryPackInclude]
+ RelayFlowOrderType OrderType => info.OrderType;
+
+ [MemoryPackConstructor]
+ SerializableRelayFlowRequestInfo(string key, string secretKey, int page, int pageSize, RelayFlowOrder order, RelayFlowOrderType orderType)
+ {
+ var info = new RelayFlowRequestInfo
+ {
+ Key = key,
+ Order = order,
+ OrderType = orderType,
+ Page = page,
+ PageSize = pageSize,
+ SecretKey = secretKey
+ };
+ this.info = info;
+ }
+
+ public SerializableRelayFlowRequestInfo(RelayFlowRequestInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class RelayFlowRequestInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayFlowRequestInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableRelayFlowRequestInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayFlowRequestInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableRelayFlowResponseInfo
+ {
+ [MemoryPackIgnore]
+ public readonly RelayFlowResponseInfo info;
+
+ [MemoryPackInclude]
+ int Page => info.Page;
+
+ [MemoryPackInclude]
+ int PageSize => info.PageSize;
+
+ [MemoryPackInclude]
+ int Count => info.Count;
+
+ [MemoryPackInclude]
+ List Data => info.Data;
+
+ [MemoryPackConstructor]
+ SerializableRelayFlowResponseInfo(int page, int pageSize, int count, List data)
+ {
+ var info = new RelayFlowResponseInfo
+ {
+ Page = page,
+ PageSize = pageSize,
+ Count = count,
+ Data = data
+ };
+ this.info = info;
+ }
+
+ public SerializableRelayFlowResponseInfo(RelayFlowResponseInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class RelayFlowResponseInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref RelayFlowResponseInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableRelayFlowResponseInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref RelayFlowResponseInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardFlowItemInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardFlowItemInfo info;
+
+ [MemoryPackInclude]
+ ulong ReceiveBytes => info.ReceiveBytes;
+
+ [MemoryPackInclude]
+ ulong SendtBytes => info.SendtBytes;
+
+ [MemoryPackInclude]
+ ulong DiffReceiveBytes => info.DiffReceiveBytes;
+
+ [MemoryPackInclude]
+ ulong DiffSendtBytes => info.DiffSendtBytes;
+
+ [MemoryPackInclude]
+ string Key => info.Key;
+
+ [MemoryPackConstructor]
+ SerializableSForwardFlowItemInfo(ulong receiveBytes, ulong sendtBytes, ulong diffReceiveBytes, ulong diffSendtBytes, string key)
+ {
+ var info = new SForwardFlowItemInfo
+ {
+ ReceiveBytes = receiveBytes,
+ SendtBytes = sendtBytes,
+
+ DiffReceiveBytes = diffReceiveBytes,
+ DiffSendtBytes = diffSendtBytes,
+ Key = key
+ };
+ this.info = info;
+ }
+
+ public SerializableSForwardFlowItemInfo(SForwardFlowItemInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardFlowItemInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref SForwardFlowItemInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableSForwardFlowItemInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardFlowItemInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardFlowRequestInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardFlowRequestInfo info;
+
+ [MemoryPackInclude]
+ string Key => info.Key;
+
+ [MemoryPackInclude]
+ string SecretKey => info.SecretKey;
+
+ [MemoryPackInclude]
+ int Page => info.Page;
+
+ [MemoryPackInclude]
+ int PageSize => info.PageSize;
+
+ [MemoryPackInclude]
+ SForwardFlowOrder Order => info.Order;
+
+ [MemoryPackInclude]
+ SForwardFlowOrderType OrderType => info.OrderType;
+
+ [MemoryPackConstructor]
+ SerializableSForwardFlowRequestInfo(string key, string secretKey, int page, int pageSize, SForwardFlowOrder order, SForwardFlowOrderType orderType)
+ {
+ var info = new SForwardFlowRequestInfo
+ {
+ Key = key,
+ Order = order,
+ OrderType = orderType,
+ Page = page,
+ PageSize = pageSize,
+ SecretKey = secretKey
+ };
+ this.info = info;
+ }
+
+ public SerializableSForwardFlowRequestInfo(SForwardFlowRequestInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardFlowRequestInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref SForwardFlowRequestInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableSForwardFlowRequestInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardFlowRequestInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardFlowResponseInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardFlowResponseInfo info;
+
+ [MemoryPackInclude]
+ int Page => info.Page;
+
+ [MemoryPackInclude]
+ int PageSize => info.PageSize;
+
+ [MemoryPackInclude]
+ int Count => info.Count;
+
+ [MemoryPackInclude]
+ List Data => info.Data;
+
+ [MemoryPackConstructor]
+ SerializableSForwardFlowResponseInfo(int page, int pageSize, int count, List data)
+ {
+ var info = new SForwardFlowResponseInfo
+ {
+ Page = page,
+ PageSize = pageSize,
+ Count = count,
+ Data = data
+ };
+ this.info = info;
+ }
+
+ public SerializableSForwardFlowResponseInfo(SForwardFlowResponseInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardFlowResponseInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref SForwardFlowResponseInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableSForwardFlowResponseInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardFlowResponseInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+}
diff --git a/linker.messenger.serializer.memorypack/ForwardSerializer.cs b/linker.messenger.serializer.memorypack/ForwardSerializer.cs
new file mode 100644
index 00000000..1b9604fe
--- /dev/null
+++ b/linker.messenger.serializer.memorypack/ForwardSerializer.cs
@@ -0,0 +1,269 @@
+using MemoryPack;
+using System.Net;
+using linker.messenger.forward;
+
+namespace linker.messenger.serializer.memorypack
+{
+ [MemoryPackable]
+ public readonly partial struct SerializableForwardInfo
+ {
+ [MemoryPackIgnore]
+ public readonly ForwardInfo info;
+
+ [MemoryPackInclude]
+ uint Id => info.Id;
+
+ [MemoryPackInclude]
+ string Name => info.Name;
+
+ [MemoryPackInclude]
+ string MachineId => info.MachineId;
+
+ [MemoryPackInclude]
+ string GroupId => info.GroupId;
+
+ [MemoryPackInclude]
+ string MachineName => info.MachineName;
+
+ [MemoryPackInclude, MemoryPackAllowSerialize]
+ IPAddress BindIPAddress => info.BindIPAddress;
+
+ [MemoryPackInclude]
+ int Port => info.Port;
+
+ [MemoryPackInclude, MemoryPackAllowSerialize]
+ IPEndPoint TargetEP => info.TargetEP;
+
+ [MemoryPackInclude]
+ bool Started => info.Started;
+
+ [MemoryPackInclude]
+ byte BufferSize => info.BufferSize;
+
+ [MemoryPackInclude]
+ string Msg => info.Msg;
+
+ [MemoryPackInclude]
+ string TargetMsg => info.TargetMsg;
+
+ [MemoryPackConstructor]
+ SerializableForwardInfo(uint id, string name, string machineId, string groupId, string machineName, IPAddress bindIPAddress, int port, IPEndPoint targetEP, bool started, byte bufferSize, string msg, string targetMsg)
+ {
+ this.info = new ForwardInfo
+ {
+ Name = name,
+ BufferSize = bufferSize,
+ Id = id,
+ Started = started,
+ BindIPAddress = bindIPAddress,
+ GroupId = groupId,
+ MachineId = machineId,
+ MachineName = machineName,
+ Msg = msg,
+ Port = port,
+ TargetEP = targetEP,
+ TargetMsg = targetMsg
+
+ };
+ }
+
+ public SerializableForwardInfo(ForwardInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class ForwardInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref ForwardInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableForwardInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableForwardAddForwardInfo
+ {
+ [MemoryPackIgnore]
+ public readonly ForwardAddForwardInfo info;
+
+ [MemoryPackInclude]
+ string MachineId => info.MachineId;
+
+ [MemoryPackInclude, MemoryPackAllowSerialize]
+ ForwardInfo Data => info.Data;
+
+ [MemoryPackConstructor]
+ SerializableForwardAddForwardInfo(string machineId, ForwardInfo data)
+ {
+ this.info = new ForwardAddForwardInfo
+ {
+ MachineId = machineId,
+ Data = data
+ };
+ }
+
+ public SerializableForwardAddForwardInfo(ForwardAddForwardInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class ForwardAddForwardInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref ForwardAddForwardInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableForwardAddForwardInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardAddForwardInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableForwardRemoveForwardInfo
+ {
+ [MemoryPackIgnore]
+ public readonly ForwardRemoveForwardInfo info;
+
+ [MemoryPackInclude]
+ string MachineId => info.MachineId;
+
+ [MemoryPackInclude, MemoryPackAllowSerialize]
+ uint Id => info.Id;
+
+ [MemoryPackConstructor]
+ SerializableForwardRemoveForwardInfo(string machineId, uint id)
+ {
+ this.info = new ForwardRemoveForwardInfo
+ {
+ MachineId = machineId,
+ Id = id
+ };
+ }
+
+ public SerializableForwardRemoveForwardInfo(ForwardRemoveForwardInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class ForwardRemoveForwardInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref ForwardRemoveForwardInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableForwardRemoveForwardInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardRemoveForwardInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableForwardCountInfo
+ {
+ [MemoryPackIgnore]
+ public readonly ForwardCountInfo info;
+
+ [MemoryPackInclude]
+ string MachineId => info.MachineId;
+
+ [MemoryPackInclude]
+ int Count => info.Count;
+
+ [MemoryPackConstructor]
+ SerializableForwardCountInfo(string machineId, int count)
+ {
+ this.info = new ForwardCountInfo
+ {
+ MachineId = machineId,
+ Count = count
+ };
+ }
+
+ public SerializableForwardCountInfo(ForwardCountInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class ForwardCountInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref ForwardCountInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableForwardCountInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref ForwardCountInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+}
diff --git a/linker.messenger.serializer.memorypack/SForwardSerializer.cs b/linker.messenger.serializer.memorypack/SForwardSerializer.cs
new file mode 100644
index 00000000..17d90055
--- /dev/null
+++ b/linker.messenger.serializer.memorypack/SForwardSerializer.cs
@@ -0,0 +1,444 @@
+using MemoryPack;
+using linker.messenger.sforward;
+using System.Net;
+
+namespace linker.messenger.serializer.memorypack
+{
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardInfo info;
+
+ [MemoryPackInclude]
+ uint Id => info.Id;
+
+ [MemoryPackInclude]
+ string Name => info.Name;
+
+ [MemoryPackInclude]
+ string Domain => info.Domain;
+
+ [MemoryPackInclude]
+ int RemotePort => info.RemotePort;
+
+ [MemoryPackInclude]
+ byte BufferSize => info.BufferSize;
+
+ [MemoryPackInclude, MemoryPackAllowSerialize]
+ IPEndPoint LocalEP => info.LocalEP;
+
+ [MemoryPackInclude]
+ bool Started => info.Started;
+
+ [MemoryPackInclude]
+ string Msg => info.Msg;
+
+ [MemoryPackInclude]
+ string LocalMsg => info.LocalMsg;
+
+ [MemoryPackInclude]
+ int RemotePortMin => info.RemotePortMin;
+
+ [MemoryPackInclude]
+ int RemotePortMax => info.RemotePortMax;
+
+ [MemoryPackConstructor]
+ SerializableSForwardInfo(uint id, string name, string domain, int remotePort, byte bufferSize, IPEndPoint localEP, bool started, string msg, string localMsg, int remotePortMin, int remotePortMax)
+ {
+ this.info = new SForwardInfo
+ {
+ LocalEP = localEP,
+ RemotePort = remotePort,
+ RemotePortMax = remotePortMax,
+ Name = name,
+ BufferSize = bufferSize,
+ Domain = domain,
+ Id = id,
+ LocalMsg = localMsg,
+ Msg = localMsg,
+ RemotePortMin = remotePortMin,
+ Started = started,
+ };
+ }
+
+ public SerializableSForwardInfo(SForwardInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref SForwardInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableSForwardInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardAddInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardAddInfo info;
+
+ [MemoryPackInclude]
+ string Domain => info.Domain;
+
+ [MemoryPackInclude]
+ int RemotePort => info.RemotePort;
+
+ [MemoryPackInclude]
+ string SecretKey => info.SecretKey;
+
+ [MemoryPackConstructor]
+ SerializableSForwardAddInfo(string domain, int remotePort, string secretKey)
+ {
+ this.info = new SForwardAddInfo
+ {
+ RemotePort = remotePort,
+ Domain = domain,
+ SecretKey = secretKey
+ };
+ }
+
+ public SerializableSForwardAddInfo(SForwardAddInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardAddInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref SForwardAddInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableSForwardAddInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardAddInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardAddResultInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardAddResultInfo info;
+
+ [MemoryPackInclude]
+ bool Success => info.Success;
+
+ [MemoryPackInclude]
+ string Message => info.Message;
+
+ [MemoryPackInclude]
+ byte BufferSize => info.BufferSize;
+
+ [MemoryPackConstructor]
+ SerializableSForwardAddResultInfo(bool success, string message, byte bufferSize)
+ {
+ this.info = new SForwardAddResultInfo
+ {
+ BufferSize = bufferSize,
+ Message = message,
+ Success = success
+ };
+ }
+
+ public SerializableSForwardAddResultInfo(SForwardAddResultInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardAddResultInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize(ref MemoryPackWriter writer, scoped ref SForwardAddResultInfo value)
+ {
+ if (value == null)
+ {
+ writer.WriteNullObjectHeader();
+ return;
+ }
+
+ writer.WritePackable(new SerializableSForwardAddResultInfo(value));
+ }
+
+ public override void Deserialize(ref MemoryPackReader reader, scoped ref SForwardAddResultInfo value)
+ {
+ if (reader.PeekIsNull())
+ {
+ reader.Advance(1); // skip null block
+ value = null;
+ return;
+ }
+
+ var wrapped = reader.ReadPackable();
+ value = wrapped.info;
+ }
+ }
+
+
+
+ [MemoryPackable]
+ public readonly partial struct SerializableSForwardAddForwardInfo
+ {
+ [MemoryPackIgnore]
+ public readonly SForwardAddForwardInfo info;
+
+ [MemoryPackInclude]
+ string MachineId => info.MachineId;
+
+ [MemoryPackInclude, MemoryPackAllowSerialize]
+ SForwardInfo Data => info.Data;
+
+ [MemoryPackConstructor]
+ SerializableSForwardAddForwardInfo(string machineId, SForwardInfo data)
+ {
+ this.info = new SForwardAddForwardInfo
+ {
+ MachineId = machineId,
+ Data = data
+ };
+ }
+
+ public SerializableSForwardAddForwardInfo(SForwardAddForwardInfo info)
+ {
+ this.info = info;
+ }
+ }
+ public class SForwardAddForwardInfoFormatter : MemoryPackFormatter
+ {
+ public override void Serialize