user || !$this->server || $this->user->cannot(Permission::ACTION_WEBSOCKET_CONNECT, $this->server)) { throw new HttpForbiddenException('You do not have permission to connect to this server\'s websocket.'); } // @phpstan-ignore-next-line $permissions = app(GetUserPermissionsService::class)->handle($this->server, $this->user); // @phpstan-ignore-next-line return app(NodeJWTService::class) ->setExpiresAt(now()->addMinutes(10)->toImmutable()) ->setUser($this->user) ->setClaims([ 'server_uuid' => $this->server->uuid, 'permissions' => $permissions, ]) ->handle($this->server->node, $this->user->id . $this->server->uuid)->toString(); } protected function getSocket(): string { $socket = str_replace(['https://', 'http://'], ['wss://', 'ws://'], $this->server->node->getConnectionAddress()); $socket .= sprintf('/api/servers/%s/ws', $this->server->uuid); return $socket; } protected function canSendCommand(): bool { return !$this->server->isInConflictState() && $this->server->retrieveStatus() === 'running'; } public function up(): void { $this->historyIndex = min($this->historyIndex + 1, count($this->history) - 1); $this->input = $this->history[$this->historyIndex] ?? ''; } public function down(): void { $this->historyIndex = max($this->historyIndex - 1, -1); $this->input = $this->history[$this->historyIndex] ?? ''; } public function enter(): void { if (!empty($this->input) && $this->canSendCommand()) { $this->dispatch('sendServerCommand', command: $this->input); $this->history = Arr::prepend($this->history, $this->input); $this->historyIndex = -1; $this->input = ''; } } #[On('store-stats')] public function storeStats(string $data): void { $data = json_decode($data); $timestamp = now()->getTimestamp(); foreach ($data as $key => $value) { $cacheKey = "servers.{$this->server->id}.$key"; $data = cache()->get($cacheKey, []); $data[$timestamp] = $value; cache()->put($cacheKey, $data, now()->addMinute()); } } }