diff --git a/app/Server/Factory.php b/app/Server/Factory.php
index 29dbf90..349de6b 100644
--- a/app/Server/Factory.php
+++ b/app/Server/Factory.php
@@ -10,11 +10,14 @@ use App\Http\Server as HttpServer;
use App\Server\Connections\ConnectionManager;
use App\Server\Http\Controllers\Admin\DeleteUsersController;
use App\Server\Http\Controllers\Admin\DisconnectSiteController;
+use App\Server\Http\Controllers\Admin\DisconnectTcpConnectionController;
use App\Server\Http\Controllers\Admin\GetSettingsController;
use App\Server\Http\Controllers\Admin\GetSitesController;
+use App\Server\Http\Controllers\Admin\GetTcpConnectionsController;
use App\Server\Http\Controllers\Admin\GetUserDetailsController;
use App\Server\Http\Controllers\Admin\GetUsersController;
use App\Server\Http\Controllers\Admin\ListSitesController;
+use App\Server\Http\Controllers\Admin\ListTcpConnectionsController;
use App\Server\Http\Controllers\Admin\ListUsersController;
use App\Server\Http\Controllers\Admin\RedirectToUsersController;
use App\Server\Http\Controllers\Admin\ShowSettingsController;
@@ -120,6 +123,7 @@ class Factory
$this->router->get('/users', ListUsersController::class, $adminCondition);
$this->router->get('/settings', ShowSettingsController::class, $adminCondition);
$this->router->get('/sites', ListSitesController::class, $adminCondition);
+ $this->router->get('/tcp', ListTcpConnectionsController::class, $adminCondition);
$this->router->get('/api/settings', GetSettingsController::class, $adminCondition);
$this->router->post('/api/settings', StoreSettingsController::class, $adminCondition);
@@ -129,6 +133,8 @@ class Factory
$this->router->delete('/api/users/{id}', DeleteUsersController::class, $adminCondition);
$this->router->get('/api/sites', GetSitesController::class, $adminCondition);
$this->router->delete('/api/sites/{id}', DisconnectSiteController::class, $adminCondition);
+ $this->router->get('/api/tcp', GetTcpConnectionsController::class, $adminCondition);
+ $this->router->delete('/api/tcp/{id}', DisconnectTcpConnectionController::class, $adminCondition);
}
protected function bindConfiguration()
diff --git a/app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php b/app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php
new file mode 100644
index 0000000..f371c0c
--- /dev/null
+++ b/app/Server/Http/Controllers/Admin/DisconnectTcpConnectionController.php
@@ -0,0 +1,42 @@
+connectionManager = $connectionManager;
+ }
+
+ public function handle(Request $request, ConnectionInterface $httpConnection)
+ {
+ $connection = $this->connectionManager->findControlConnectionForClientId($request->get('id'));
+
+ if (! is_null($connection)) {
+ $connection->close();
+
+ $this->connectionManager->removeControlConnection($connection);
+ }
+
+ $httpConnection->send(respond_json([
+ 'tcp_connections' => collect($this->connectionManager->getConnections())
+ ->filter(function ($connection) {
+ return get_class($connection) === TcpControlConnection::class;
+ })
+ ->values(),
+ ]));
+ }
+}
diff --git a/app/Server/Http/Controllers/Admin/GetSitesController.php b/app/Server/Http/Controllers/Admin/GetSitesController.php
index 0a9af71..76b2ead 100644
--- a/app/Server/Http/Controllers/Admin/GetSitesController.php
+++ b/app/Server/Http/Controllers/Admin/GetSitesController.php
@@ -4,6 +4,7 @@ namespace App\Server\Http\Controllers\Admin;
use App\Contracts\ConnectionManager;
use App\Server\Configuration;
+use App\Server\Connections\ControlConnection;
use Illuminate\Http\Request;
use Ratchet\ConnectionInterface;
@@ -23,7 +24,11 @@ class GetSitesController extends AdminController
{
$httpConnection->send(
respond_json([
- 'sites' => collect($this->connectionManager->getConnections())->map(function ($site, $siteId) {
+ 'sites' => collect($this->connectionManager->getConnections())
+ ->filter(function ($connection) {
+ return get_class($connection) === ControlConnection::class;
+ })
+ ->map(function ($site, $siteId) {
$site = $site->toArray();
$site['id'] = $siteId;
diff --git a/app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php b/app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php
new file mode 100644
index 0000000..5f98546
--- /dev/null
+++ b/app/Server/Http/Controllers/Admin/GetTcpConnectionsController.php
@@ -0,0 +1,41 @@
+connectionManager = $connectionManager;
+ }
+
+ public function handle(Request $request, ConnectionInterface $httpConnection)
+ {
+ $httpConnection->send(
+ respond_json([
+ 'tcp_connections' => collect($this->connectionManager->getConnections())
+ ->filter(function ($connection) {
+ return get_class($connection) === TcpControlConnection::class;
+ })
+ ->map(function ($site, $siteId) {
+ $site = $site->toArray();
+ $site['id'] = $siteId;
+
+ return $site;
+ })
+ ->values(),
+ ])
+ );
+ }
+}
diff --git a/app/Server/Http/Controllers/Admin/ListSitesController.php b/app/Server/Http/Controllers/Admin/ListSitesController.php
index 8e23976..3ca6bcc 100644
--- a/app/Server/Http/Controllers/Admin/ListSitesController.php
+++ b/app/Server/Http/Controllers/Admin/ListSitesController.php
@@ -4,6 +4,7 @@ namespace App\Server\Http\Controllers\Admin;
use App\Contracts\ConnectionManager;
use App\Server\Configuration;
+use App\Server\Connections\ControlConnection;
use Illuminate\Http\Request;
use Ratchet\ConnectionInterface;
@@ -25,12 +26,17 @@ class ListSitesController extends AdminController
$sites = $this->getView($httpConnection, 'server.sites.index', [
'scheme' => $this->configuration->port() === 443 ? 'https' : 'http',
'configuration' => $this->configuration,
- 'sites' => collect($this->connectionManager->getConnections())->map(function ($site, $siteId) {
- $site = $site->toArray();
- $site['id'] = $siteId;
+ 'sites' => collect($this->connectionManager->getConnections())
+ ->filter(function ($connection) {
+ return get_class($connection) === ControlConnection::class;
+ })
+ ->map(function ($site, $siteId) {
+ $site = $site->toArray();
+ $site['id'] = $siteId;
- return $site;
- })->values(),
+ return $site;
+ })
+ ->values(),
]);
$httpConnection->send(
diff --git a/app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php b/app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php
new file mode 100644
index 0000000..2d219fe
--- /dev/null
+++ b/app/Server/Http/Controllers/Admin/ListTcpConnectionsController.php
@@ -0,0 +1,46 @@
+connectionManager = $connectionManager;
+ $this->configuration = $configuration;
+ }
+
+ public function handle(Request $request, ConnectionInterface $httpConnection)
+ {
+ $sites = $this->getView($httpConnection, 'server.tcp.index', [
+ 'scheme' => $this->configuration->port() === 443 ? 'https' : 'http',
+ 'configuration' => $this->configuration,
+ 'connections' => collect($this->connectionManager->getConnections())
+ ->filter(function ($connection) {
+ return get_class($connection) === TcpControlConnection::class;
+ })
+ ->map(function ($connection, $connectionId) {
+ $connection = $connection->toArray();
+ $connection['id'] = $connectionId;
+
+ return $connection;
+ })
+ ->values(),
+ ]);
+
+ $httpConnection->send(
+ respond_html($sites)
+ );
+ }
+}
diff --git a/resources/views/server/layouts/app.twig b/resources/views/server/layouts/app.twig
index cd29021..d1bdadf 100644
--- a/resources/views/server/layouts/app.twig
+++ b/resources/views/server/layouts/app.twig
@@ -27,6 +27,12 @@
ml-8 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium leading-5 focus:outline-none transition duration-150 ease-in-out">
Shared sites
+
+ TCP connections
+
+
+
+
+
+
+
+
+
+ Local Port
+
+
+ Expose Port
+
+
+ Shared At
+
+
+
+
+
+
+ @{ connection.port }
+
+
+ @{ connection.shared_port }
+
+
+ @{ connection.shared_at }
+
+
+ Disconnect
+
+