Skip to content

Commit 326d346

Browse files
committed
Handle errors sent back over the sockt
1 parent b78276d commit 326d346

File tree

4 files changed

+32
-13
lines changed

4 files changed

+32
-13
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ public function __invoke(Request $request, Server $server)
6363
->expiresAt($now->addMinutes(15)->getTimestamp())
6464
->withClaim('user_id', $request->user()->id)
6565
->withClaim('server_uuid', $server->uuid)
66-
->withClaim('permissions', ['connect', 'send-command', 'send-power'])
66+
->withClaim('permissions', array_merge([
67+
'connect',
68+
'send-command',
69+
'send-power',
70+
], $request->user()->root_admin ? ['receive-errors'] : []))
6771
->getToken($signer, new Key($server->node->daemonSecret));
6872

6973
$socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $server->node->getConnectionAddress());

resources/scripts/components/server/Console.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ export default () => {
4545
line.replace(/(?:\r\n|\r|\n)$/im, '') + '\u001b[0m',
4646
);
4747

48+
const handleDaemonErrorOutput = (line: string) => terminal.writeln(
49+
'\u001b[1m\u001b[41m[Internal] ' + line.replace(/(?:\r\n|\r|\n)$/im, '') + '\u001b[0m',
50+
);
51+
4852
const handleCommandKeydown = (e: React.KeyboardEvent<HTMLInputElement>) => {
4953
if (e.key !== 'Enter' || (e.key === 'Enter' && e.currentTarget.value.length < 1)) {
5054
return;
@@ -69,11 +73,13 @@ export default () => {
6973
terminal.clear();
7074

7175
instance.addListener('console output', handleConsoleOutput);
76+
instance.addListener('daemon error', handleDaemonErrorOutput);
7277
instance.send('send logs');
7378
}
7479

7580
return () => {
76-
instance && instance.removeListener('console output', handleConsoleOutput);
81+
instance && instance.removeListener('console output', handleConsoleOutput)
82+
.removeListener('daemon error', handleDaemonErrorOutput);
7783
};
7884
}, [ connected, instance ]);
7985

resources/scripts/components/server/WebsocketHandler.tsx

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ import getWebsocketToken from '@/api/server/getWebsocketToken';
55

66
export default () => {
77
const server = ServerContext.useStoreState(state => state.server.data);
8-
const { instance, connected } = ServerContext.useStoreState(state => state.socket);
8+
const { instance } = ServerContext.useStoreState(state => state.socket);
99
const setServerStatus = ServerContext.useStoreActions(actions => actions.status.setServerStatus);
1010
const { setInstance, setConnectionState } = ServerContext.useStoreActions(actions => actions.socket);
1111

12+
const updateToken = (uuid: string, socket: Websocket) => {
13+
getWebsocketToken(uuid)
14+
.then(data => socket.setToken(data.token))
15+
.catch(error => console.error(error));
16+
};
17+
1218
useEffect(() => {
1319
// If there is already an instance or there is no server, just exit out of this process
1420
// since we don't need to make a new connection.
@@ -23,6 +29,13 @@ export default () => {
2329
socket.on('SOCKET_ERROR', () => setConnectionState(false));
2430
socket.on('status', (status) => setServerStatus(status));
2531

32+
socket.on('daemon error', message => {
33+
console.warn('Got error message from daemon socket:', message);
34+
});
35+
36+
socket.on('token expiring', () => updateToken(server.uuid, socket));
37+
socket.on('token expired', () => updateToken(server.uuid, socket));
38+
2639
getWebsocketToken(server.uuid)
2740
.then(data => {
2841
socket.setToken(data.token).connect(data.socket);
@@ -36,15 +49,5 @@ export default () => {
3649
};
3750
}, [ server ]);
3851

39-
// Prevent issues with HMR in development environments. This might need to also
40-
// exist outside of dev? Will need to see how things go.
41-
if (process.env.NODE_ENV === 'development') {
42-
useEffect(() => {
43-
if (!connected && instance && instance.getToken() && instance.getSocketUrl()) {
44-
instance.connect(instance.getSocketUrl()!);
45-
}
46-
}, [ connected ]);
47-
}
48-
4952
return null;
5053
};

resources/scripts/plugins/Websocket.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ export class Websocket extends EventEmitter {
5151
setToken (token: string): this {
5252
this.token = token;
5353

54+
if (this.url) {
55+
this.send('auth', token);
56+
}
57+
5458
return this;
5559
}
5660

@@ -60,6 +64,8 @@ export class Websocket extends EventEmitter {
6064
}
6165

6266
close (code?: number, reason?: string) {
67+
this.url = null;
68+
this.token = '';
6369
this.socket && this.socket.close(code, reason);
6470
}
6571

0 commit comments

Comments
 (0)