Completed
Push — master ( b7b137...fcca16 )
by Tomasz
02:32
created

ZmqServer   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 68.08%

Importance

Changes 2
Bugs 0 Features 2
Metric Value
wmc 9
c 2
b 0
f 2
lcom 1
cbo 3
dl 0
loc 111
ccs 32
cts 47
cp 0.6808
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
B run() 0 39 6
A setLogger() 0 4 1
A getZmqSocket() 0 10 1
1
<?php
2
/**
3
     * ZeroMQ interface for cruftflake.
4
     * 
5
     * @author @davegardnerisme
6
     */
7
8
namespace Gendoria\CruftFlake\Zmq;
9
10
use Exception;
11
use Gendoria\CruftFlake\Generator\Generator;
12
use Gendoria\CruftFlake\ServerInterface;
13
use Psr\Log\LoggerAwareInterface;
14
use Psr\Log\LoggerInterface;
15
use Psr\Log\NullLogger;
16
17
class ZmqServer implements ServerInterface, LoggerAwareInterface
18
{
19
    /**
20
     * Cruft flake generator.
21
     * 
22
     * @var Generator
23
     */
24
    private $generator;
25
26
    /**
27
     * Port.
28
     * 
29
     * @var int
30
     */
31
    private $port;
32
33
    /**
34
     * Logger.
35
     * 
36
     * @var LoggerInterface
37
     */
38
    private $logger;
39
40
    private $debugMode = false;
41
42
    /**
43
     * Constructor.
44
     * 
45
     * @param @inject Generator $generator
46
     * @param string            $port      Which TCP port to list on, default 5599
47
     * @param bool              $debugMode Debug mode. If set to true, server will only listen for one command, before exiting.
48
     */
49 3
    public function __construct(Generator $generator, $port = 5599, $debugMode = false)
50
    {
51 3
        $this->generator = $generator;
52 3
        $this->port = $port;
53 3
        $this->logger = new NullLogger();
54 3
        $this->debugMode = $debugMode;
55 3
    }
56
57
    /**
58
     * Run ZMQ interface for generator.
59
     * 
60
     * Req-rep pattern; msgs are commands:
61
     * 
62
     * GEN    = Generate ID
63
     * STATUS = Get status string
64
     */
65 3
    public function run()
66
    {
67 3
        $receiver = $this->getZmqSocket($this->port);
68
        $response = array(
69 3
            'code' => 200,
70 3
            'message' => '',
71 3
        );
72 3
        while (true) {
73 3
            $msg = $receiver->recv();
74 3
            $this->logger->debug('ZMQ server received command: '.$msg);
75
            switch ($msg) {
76 3
                case 'GEN':
77
                    try {
78 1
                        $response['message'] = $this->generator->generate();
79 1
                    } catch (Exception $e) {
80
                        $this->logger->error('Generator error: '.$e->getMessage(), array($e, $this));
81
                        $response = array(
82
                            'code' => 500,
83
                            'message' => 'ERROR',
84
                        );
85
                    }
86 1
                    break;
87 2
                case 'STATUS':
88 1
                    $response['message'] = $this->generator->status();
89 1
                    break;
90 1
                default:
91 1
                    $this->logger->debug('Unknown command received: '.$msg);
92
                    $response = array(
93 1
                        'code' => 404,
94 1
                        'message' => 'UNKNOWN COMMAND',
95 1
                    );
96 1
                    break;
97 1
            }
98 3
            $receiver->send(json_encode($response));
99 3
            if ($this->debugMode) {
100 3
                break;
101
            }
102
        }
103 3
    }
104
105
    /**
106
     * Get ZMQ socket.
107
     * 
108
     * @param int $port Port, on which ZMQ connection should listen.
109
     *
110
     * @return \ZMQSocket
111
     */
112
    public function getZmqSocket($port)
113
    {
114
        $context = new \ZMQContext();
115
        $receiver = new \ZMQSocket($context, \ZMQ::SOCKET_REP);
116
        $bindTo = 'tcp://*:'.$port;
117
        $this->logger->debug("Binding to {$bindTo}");
118
        $receiver->bind($bindTo);
119
120
        return $receiver;
121
    }
122
123
    public function setLogger(LoggerInterface $logger)
124
    {
125
        $this->logger = $logger;
126
    }
127
}
128