Completed
Push — master ( edcf20...3ec6c0 )
by Marcel
03:05 queued 01:22
created

src/Server/Logger/WebsocketsLogger.php (6 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace BeyondCode\LaravelWebSockets\Server\Logger;
4
5
use Exception;
6
use Ratchet\ConnectionInterface;
7
use Ratchet\RFC6455\Messaging\MessageInterface;
8
use Ratchet\WebSocket\MessageComponentInterface;
9
use BeyondCode\LaravelWebSockets\QueryParameters;
10
11
class WebsocketsLogger extends Logger implements MessageComponentInterface
12
{
13
    /** @var \Ratchet\Http\HttpServerInterface */
14
    protected $app;
15
16
    public static function decorate(MessageComponentInterface $app): self
17
    {
18
        $logger = app(self::class);
19
20
        return $logger->setApp($app);
21
    }
22
23
    public function setApp(MessageComponentInterface $app)
24
    {
25
        $this->app = $app;
0 ignored issues
show
Documentation Bug introduced by
It seems like $app of type object<Ratchet\WebSocket...sageComponentInterface> is incompatible with the declared type object<Ratchet\Http\HttpServerInterface> of property $app.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
26
27
        return $this;
28
    }
29
30
    public function onOpen(ConnectionInterface $connection)
31
    {
32
        $appKey = QueryParameters::create($connection->httpRequest)->get('appKey');
0 ignored issues
show
Accessing httpRequest on the interface Ratchet\ConnectionInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
33
34
        $this->warn("New connection opened for app key {$appKey}.");
35
36
        $this->app->onOpen(ConnectionLogger::decorate($connection));
37
    }
38
39
    public function onMessage(ConnectionInterface $connection, MessageInterface $message)
40
    {
41
        $this->info("{$connection->app->id}: connection id {$connection->socketId} received message: {$message->getPayload()}.");
0 ignored issues
show
Accessing app on the interface Ratchet\ConnectionInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
Accessing socketId on the interface Ratchet\ConnectionInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
42
43
        $this->app->onMessage(ConnectionLogger::decorate($connection), $message);
44
    }
45
46
    public function onClose(ConnectionInterface $connection)
47
    {
48
        $socketId = $connection->socketId ?? null;
0 ignored issues
show
Accessing socketId on the interface Ratchet\ConnectionInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
49
50
        $this->warn("Connection id {$socketId} closed.");
51
52
        $this->app->onClose(ConnectionLogger::decorate($connection));
53
    }
54
55
    public function onError(ConnectionInterface $connection, Exception $exception)
56
    {
57
        $exceptionClass = get_class($exception);
58
59
        $appId = $connection->app->id ?? 'Unknown app id';
0 ignored issues
show
Accessing app on the interface Ratchet\ConnectionInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
60
61
        $message = "{$appId}: exception `{$exceptionClass}` thrown: `{$exception->getMessage()}`.";
62
63
        if ($this->verbose) {
64
            $message .= $exception->getTraceAsString();
65
        }
66
67
        $this->error($message);
68
69
        $this->app->onError(ConnectionLogger::decorate($connection), $exception);
70
    }
71
}
72