Add KCP support

This commit is contained in:
2026-05-29 01:06:18 +08:00
parent 6d9299eeb0
commit 661ed401da
31 changed files with 3829 additions and 174 deletions
+2 -2
View File
@@ -4,7 +4,7 @@ declare(strict_types=1);
namespace LayLink\Node;
use Workerman\Connection\TcpConnection;
use LayLink\Transport\FrameServerConnection;
final class NodeConnection
{
@@ -15,7 +15,7 @@ final class NodeConnection
public readonly string $nodeId,
public readonly string $nodeType,
public readonly string $nodeZone,
public readonly TcpConnection $connection,
public readonly FrameServerConnection $connection,
) {
$this->lastHeartbeat = time();
}
+38 -10
View File
@@ -4,23 +4,30 @@ declare(strict_types=1);
namespace LayLink\Node;
use Workerman\Connection\TcpConnection;
use LayLink\Transport\FrameServerConnection;
final class NodeRegistry
{
/** @var array<string, NodeConnection> */
/** @var array<string, array<int, NodeConnection>> */
private array $nodes = [];
public function register(NodeConnection $node): void
{
$this->nodes[$node->nodeId] = $node;
$this->nodes[$node->nodeId][$node->connection->id()] = $node;
}
public function unregisterByConnection(TcpConnection $connection): ?NodeConnection
public function unregisterByConnection(FrameServerConnection $connection): ?NodeConnection
{
foreach ($this->nodes as $nodeId => $node) {
if ($node->connection === $connection) {
unset($this->nodes[$nodeId]);
foreach ($this->nodes as $nodeId => $connections) {
foreach ($connections as $connectionId => $node) {
if ($node->connection !== $connection) {
continue;
}
unset($this->nodes[$nodeId][$connectionId]);
if ($this->nodes[$nodeId] === []) {
unset($this->nodes[$nodeId]);
}
return $node;
}
}
@@ -30,12 +37,26 @@ final class NodeRegistry
public function get(string $nodeId): ?NodeConnection
{
return $this->nodes[$nodeId] ?? null;
$connections = $this->nodes[$nodeId] ?? [];
return $connections === [] ? null : array_values($connections)[0];
}
public function getByConnection(FrameServerConnection $connection): ?NodeConnection
{
foreach ($this->nodes as $connections) {
foreach ($connections as $node) {
if ($node->connection === $connection) {
return $node;
}
}
}
return null;
}
public function isOnline(string $nodeId): bool
{
return isset($this->nodes[$nodeId]);
return ($this->nodes[$nodeId] ?? []) !== [];
}
/**
@@ -43,6 +64,13 @@ final class NodeRegistry
*/
public function all(): array
{
return array_values($this->nodes);
$nodes = [];
foreach ($this->nodes as $connections) {
foreach ($connections as $node) {
$nodes[] = $node;
}
}
return $nodes;
}
}