Skip to content

Commit 01926e2

Browse files
committed
Improve logic for logging into the websocket of the target node
1 parent 5c5e2e2 commit 01926e2

File tree

6 files changed

+63
-31
lines changed

6 files changed

+63
-31
lines changed

app/Http/Controllers/Api/Client/Servers/WebsocketController.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,18 @@ public function __invoke(ClientApiRequest $request, Server $server)
6161
$permissions = $this->permissionsService->handle($server, $user);
6262

6363
$node = null;
64-
65-
// Check if there is a transfer query param asking to connect to the target node's websocket.
66-
if ($request->query('transfer', 'false') === 'true') {
64+
if ($server->transfer !== null) {
6765
// Check if the user has permissions to receive transfer logs.
6866
if (! in_array('admin.websocket.transfer', $permissions)) {
69-
throw new HttpException(Response::HTTP_FORBIDDEN, 'You do not have permission to get transfer logs');
67+
throw new HttpException(Response::HTTP_FORBIDDEN, 'You do not have permission to view transfer logs');
7068
}
7169

72-
$node = $server->transfer->newNode;
70+
// Redirect the websocket request to the new node if the server has been archived.
71+
if ($server->transfer->archived) {
72+
$node = $server->transfer->newNode;
73+
} else {
74+
$node = $server->node;
75+
}
7376
} else {
7477
$node = $server->node;
7578
}

app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ public function archive(Request $request, string $uuid)
112112

113113
// Unsuspend the server and don't continue the transfer.
114114
if (! $request->input('successful')) {
115-
//$this->suspensionService->toggle($server, 'unsuspend');
116115
$server->transfer->forceFill([
117116
'successful' => false,
118117
])->saveOrFail();
@@ -142,6 +141,12 @@ public function archive(Request $request, string $uuid)
142141
->relatedTo($server->uuid, true)
143142
->getToken($signer, new Key($server->node->getDecryptedKey()));
144143

144+
// Update the archived field on the transfer to make clients connect to the websocket
145+
// on the new node to be able to receive transfer logs.
146+
$server->transfer->forceFill([
147+
'archived' => true,
148+
])->saveOrFail();
149+
145150
// On the daemon transfer repository, make sure to set the node after the server
146151
// because setServer() tells the repository to use the server's node and not the one
147152
// we want to specify.

app/Models/ServerTransfer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* @property string $old_additional_allocations
1313
* @property string $new_additional_allocations
1414
* @property bool|null $successful
15+
* @property bool $archived
1516
* @property \Carbon\Carbon $created_at
1617
* @property \Carbon\Carbon $updated_at
1718
*
@@ -55,6 +56,7 @@ class ServerTransfer extends Model
5556
'old_additional_allocations' => 'string',
5657
'new_additional_allocations' => 'string',
5758
'successful' => 'bool',
59+
'archived' => 'bool',
5860
];
5961

6062
/**
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
use Illuminate\Support\Facades\DB;
4+
use Illuminate\Support\Facades\Schema;
5+
use Illuminate\Database\Schema\Blueprint;
6+
use Illuminate\Database\Migrations\Migration;
7+
8+
class AddArchivedFieldToServerTransfersTable extends Migration
9+
{
10+
/**
11+
* Run the migrations.
12+
*
13+
* @return void
14+
*/
15+
public function up()
16+
{
17+
Schema::table('server_transfers', function (Blueprint $table) {
18+
$table->boolean('archived')->default(0)->after('new_additional_allocations');
19+
});
20+
21+
// Update archived to all be true on existing transfers.
22+
Schema::table('server_transfers', function (Blueprint $table) {
23+
DB::statement('UPDATE `server_transfers` SET `archived` = 1 WHERE `successful` = 1');
24+
});
25+
}
26+
27+
/**
28+
* Reverse the migrations.
29+
*
30+
* @return void
31+
*/
32+
public function down()
33+
{
34+
Schema::table('server_transfers', function (Blueprint $table) {
35+
$table->dropColumn('archived');
36+
});
37+
}
38+
}

resources/scripts/api/server/getWebsocketToken.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@ interface Response {
55
socket: string;
66
}
77

8-
export default (server: string, transfer: boolean): Promise<Response> => {
8+
export default (server: string): Promise<Response> => {
99
return new Promise((resolve, reject) => {
10-
http.get(`/api/client/servers/${server}/websocket`, {
11-
params: {
12-
transfer,
13-
},
14-
})
10+
http.get(`/api/client/servers/${server}/websocket`)
1511
.then(({ data }) => resolve({
1612
token: data.data.token,
1713
socket: data.data.socket,

resources/scripts/components/server/WebsocketHandler.tsx

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,12 @@ const reconnectErrors = [
1515
export default () => {
1616
let updatingToken = false;
1717
const [ error, setError ] = useState<'connecting' | string>('');
18-
const [ transfer, setTransfer ] = useState<boolean>(false);
1918
const { connected, instance } = ServerContext.useStoreState(state => state.socket);
2019
const uuid = ServerContext.useStoreState(state => state.server.data?.uuid);
2120
const setServerStatus = ServerContext.useStoreActions(actions => actions.status.setServerStatus);
2221
const { setInstance, setConnectionState } = ServerContext.useStoreActions(actions => actions.socket);
2322

24-
const connect = (uuid: string, transfer = false) => {
25-
setTransfer(transfer);
26-
23+
const connect = (uuid: string) => {
2724
const socket = new Websocket();
2825

2926
socket.on('auth success', () => setConnectionState(true));
@@ -52,21 +49,12 @@ export default () => {
5249
});
5350

5451
socket.on('transfer status', (status: string) => {
55-
if (status === 'success') {
56-
setTransfer(false);
52+
if (status === 'starting' || status === 'success') {
5753
return;
5854
}
5955

60-
if (status === 'starting') {
61-
return;
62-
}
63-
64-
// This doesn't use the `setTransfer` hook as it doesn't want to work properly in this context,
65-
// and causes all kinds of fuckery with the websocket.
66-
let transfer = false;
67-
if (status === 'archived') {
68-
transfer = true;
69-
}
56+
// Force a reconnection to the websocket which will connect us
57+
// to the target node instead of the source node.
7058

7159
// Close the current websocket connection.
7260
socket.close();
@@ -75,10 +63,10 @@ export default () => {
7563
setConnectionState(false);
7664
setInstance(null);
7765

78-
connect(uuid, transfer);
66+
connect(uuid);
7967
});
8068

81-
getWebsocketToken(uuid, transfer)
69+
getWebsocketToken(uuid)
8270
.then(data => {
8371
// Connect and then set the authentication token.
8472
socket.setToken(data.token).connect(data.socket);
@@ -93,7 +81,7 @@ export default () => {
9381
if (updatingToken) return;
9482

9583
updatingToken = true;
96-
getWebsocketToken(uuid, transfer)
84+
getWebsocketToken(uuid)
9785
.then(data => socket.setToken(data.token, true))
9886
.catch(error => console.error(error))
9987
.then(() => {

0 commit comments

Comments
 (0)