Skip to content

Commit 1d97574

Browse files
committed
decouple driver config from connection factory
1 parent a7b4664 commit 1d97574

File tree

6 files changed

+38
-53
lines changed

6 files changed

+38
-53
lines changed

src/Bolt/SingleBoltConnectionPool.php

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ private function returnAnyAvailableConnection(string $encryptionLevel): ?BoltCon
101101
foreach ($this->activeConnections as $activeConnection) {
102102
// We prefer a connection that is just ready
103103
if ($activeConnection->getServerState() === 'READY') {
104-
if (!$this->requiresReconnect($activeConnection, $encryptionLevel)) {
105-
return $activeConnection;
104+
if ($this->factory->canReuseConnection($activeConnection)) {
105+
return $this->factory->reuseConnection($activeConnection);
106106
} else {
107107
$requiresReconnectConnection = $activeConnection;
108108
}
@@ -116,7 +116,7 @@ private function returnAnyAvailableConnection(string $encryptionLevel): ?BoltCon
116116
// https://github.com/neo4j-php/neo4j-php-client/issues/146
117117
// NOTE: we cannot work with TX_STREAMING as we cannot force the transaction to implicitly close.
118118
if ($streamingConnection === null && $activeConnection->getServerState() === 'STREAMING') {
119-
if (!$this->requiresReconnect($activeConnection, $encryptionLevel)) {
119+
if ($this->factory->canReuseConnection($activeConnection)) {
120120
$streamingConnection = $activeConnection;
121121
$streamingConnection->consumeResults(); // State should now be ready
122122
} else {
@@ -126,20 +126,15 @@ private function returnAnyAvailableConnection(string $encryptionLevel): ?BoltCon
126126
}
127127

128128
if ($streamingConnection) {
129-
return $streamingConnection;
129+
return $this->factory->reuseConnection($streamingConnection);
130130
}
131131

132132
if ($requiresReconnectConnection) {
133133
$this->release($requiresReconnectConnection);
134134

135-
return $this->createNewConnection();
135+
return $this->factory->createConnection($this->auth);
136136
}
137137

138138
return null;
139139
}
140-
141-
private function requiresReconnect(BoltConnection $activeConnection, string $requiredEncryptionLevel): bool
142-
{
143-
return
144-
}
145140
}

src/Bolt/SslConfigurator.php

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,26 @@
1414
use function explode;
1515
use const FILTER_VALIDATE_IP;
1616
use function filter_var;
17-
use Laudis\Neo4j\Databags\DriverConfiguration;
17+
use Laudis\Neo4j\Databags\SslConfiguration;
1818
use Laudis\Neo4j\Enum\SslMode;
1919
use Psr\Http\Message\UriInterface;
2020

2121
final class SslConfigurator
2222
{
2323
/**
24-
* @param UriInterface $uri
25-
* @param DriverConfiguration $config
26-
*
2724
* @return array{0: ''|'s'|'ssc', 1: array|null}
2825
*/
29-
public function configure(UriInterface $uri, DriverConfiguration $config): array
26+
public function configure(UriInterface $uri, SslConfiguration $config): array
3027
{
31-
$sslMode = $config->getSslConfiguration()->getMode();
28+
$mode = $config->getMode();
3229
$sslConfig = '';
33-
if ($sslMode === SslMode::FROM_URL()) {
30+
if ($mode === SslMode::FROM_URL()) {
3431
$scheme = $uri->getScheme();
3532
$explosion = explode('+', $scheme, 2);
3633
$sslConfig = $explosion[1] ?? '';
37-
} elseif ($sslMode === SslMode::ENABLE()) {
34+
} elseif ($mode === SslMode::ENABLE()) {
3835
$sslConfig = 's';
39-
} elseif ($sslMode === SslMode::ENABLE_WITH_SELF_SIGNED()) {
36+
} elseif ($mode === SslMode::ENABLE_WITH_SELF_SIGNED()) {
4037
$sslConfig = 'ssc';
4138
}
4239

@@ -47,10 +44,10 @@ public function configure(UriInterface $uri, DriverConfiguration $config): array
4744
return [$sslConfig, null];
4845
}
4946

50-
private function enableSsl(string $host, string $sslConfig, DriverConfiguration $config): ?array
47+
private function enableSsl(string $host, string $sslConfig, SslConfiguration $config): ?array
5148
{
5249
$options = [
53-
'verify_peer' => $config->getSslConfiguration()->isVerifyPeer(),
50+
'verify_peer' => $config->isVerifyPeer(),
5451
'peer_name' => $host,
5552
];
5653
if (!filter_var($host, FILTER_VALIDATE_IP)) {

src/BoltFactory.php

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
use Laudis\Neo4j\Contracts\ConnectionFactoryInterface;
3030
use Laudis\Neo4j\Contracts\ConnectionInterface;
3131
use Laudis\Neo4j\Databags\DatabaseInfo;
32-
use Laudis\Neo4j\Databags\DriverConfiguration;
3332
use Laudis\Neo4j\Databags\SessionConfiguration;
33+
use Laudis\Neo4j\Databags\SslConfiguration;
3434
use Laudis\Neo4j\Databags\TransactionConfiguration;
3535
use Laudis\Neo4j\Enum\ConnectionProtocol;
3636
use Laudis\Neo4j\Exception\Neo4jException;
@@ -45,28 +45,22 @@
4545
final class BoltFactory implements ConnectionFactoryInterface
4646
{
4747
private UriInterface $uri;
48-
private AuthenticateInterface $auth;
49-
private DriverConfiguration $config;
5048
private SslConfigurator $sslConfigurator;
5149

5250
/**
5351
* @psalm-external-mutation-free
5452
*/
5553
public function __construct(
5654
UriInterface $uri,
57-
AuthenticateInterface $authenticate,
58-
DriverConfiguration $config,
5955
SslConfigurator $sslConfigurator
6056
) {
6157
$this->uri = $uri;
62-
$this->auth = $authenticate;
63-
$this->config = $config;
6458
$this->sslConfigurator = $sslConfigurator;
6559
}
6660

67-
public function createConnection(AuthenticateInterface $auth, SessionConfiguration $config): ConnectionInterface
61+
public function createConnection(string $userAgent, SslConfiguration $sslConfig, SessionConfiguration $sessionConfig, AuthenticateInterface $auth): ConnectionInterface
6862
{
69-
[$encryptionLevel, $sslConfig] = $this->sslConfigurator->configure($this->uri, $this->config);
63+
[$encryptionLevel, $sslConfig] = $this->sslConfigurator->configure($this->uri, $sslConfig);
7064
$port = $this->uri->getPort() ?? 7687;
7165
if (extension_loaded('sockets') && $sslConfig === null) {
7266
$connection = new Socket($this->uri->getHost(), $port, TransactionConfiguration::DEFAULT_TIMEOUT);
@@ -92,28 +86,30 @@ public function createConnection(AuthenticateInterface $auth, SessionConfigurati
9286
throw new RuntimeException('Client only supports bolt version 3 and up.');
9387
}
9488

95-
$response = $auth->authenticateBolt($protocol, $this->config->getUserAgent());
89+
$response = $auth->authenticateBolt($protocol, $userAgent);
9690
} catch (MessageException $e) {
9791
throw Neo4jException::fromMessageException($e);
9892
}
9993

100-
$config = new ConnectionConfiguration(
94+
$sessionConfig = new ConnectionConfiguration(
10195
$response['server'],
10296
$this->uri,
10397
explode('/', $response['server'])[1] ?? '',
10498
ConnectionProtocol::determineBoltVersion($protocol),
105-
$config->getAccessMode(),
106-
$this->config,
107-
$config->getDatabase() === null ? null : new DatabaseInfo($config->getDatabase())
99+
$sessionConfig->getAccessMode(),
100+
$sessionConfig->getDatabase() === null ? null : new DatabaseInfo($sessionConfig->getDatabase())
108101
);
109102

110-
return new BoltConnection($protocol, $connection, $config, $this->auth, $encryptionLevel);
103+
return new BoltConnection($protocol, $connection, $sessionConfig, $auth, $encryptionLevel);
111104
}
112105

113-
public function canReuseConnection(ConnectionInterface $connection): bool
106+
public function canReuseConnection(ConnectionInterface $connection, string $userAgent, SslConfiguration $sslConfig, AuthenticateInterface $auth): bool
114107
{
115-
return $connection->getAuthentication()->toString($this->uri) == $this->auth->toString($this->uri) ||
116-
$connection->getEncryptionLevel() === $this->sslConfigurator->configure($this->uri, $this->config)[0];
108+
return $connection->getAuthentication()->toString($this->uri) === $auth->toString($this->uri) &&
109+
$connection->getEncryptionLevel() === $this->sslConfigurator->configure($this->uri, $sslConfig)[0] &&
110+
$connection->getUserAgent() === $userAgent &&
111+
$connection->getServerAddress()->getHost() === $this->uri->getHost() &&
112+
$connection->getServerAddress()->getPort() === $this->uri->getPort();
117113
}
118114

119115
public function reuseConnection(ConnectionInterface $connection, SessionConfiguration $config): ConnectionInterface
@@ -124,12 +120,11 @@ public function reuseConnection(ConnectionInterface $connection, SessionConfigur
124120
$connection->getServerVersion(),
125121
$connection->getProtocol(),
126122
$config->getAccessMode(),
127-
$this->config,
128123
$config->getDatabase() === null ? null : new DatabaseInfo($config->getDatabase())
129124
);
130125

131126
[$protocol, $connectionImpl] = $connection->getImplementation();
132127

133-
return new BoltConnection($protocol, $connectionImpl, $config, $this->auth, $connection->getEncryptionLevel());
128+
return new BoltConnection($protocol, $connectionImpl, $config, $connection->getAuthentication(), $connection->getEncryptionLevel());
134129
}
135130
}

src/Common/ConnectionConfiguration.php

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
namespace Laudis\Neo4j\Common;
1515

1616
use Laudis\Neo4j\Databags\DatabaseInfo;
17-
use Laudis\Neo4j\Databags\DriverConfiguration;
1817
use Laudis\Neo4j\Enum\AccessMode;
1918
use Laudis\Neo4j\Enum\ConnectionProtocol;
2019
use Psr\Http\Message\UriInterface;
@@ -29,7 +28,6 @@ final class ConnectionConfiguration
2928
private string $serverVersion;
3029
private ConnectionProtocol $protocol;
3130
private AccessMode $accessMode;
32-
private DriverConfiguration $driverConfiguration;
3331
private ?DatabaseInfo $databaseInfo;
3432

3533
public function __construct(
@@ -38,15 +36,13 @@ public function __construct(
3836
string $serverVersion,
3937
ConnectionProtocol $protocol,
4038
AccessMode $accessMode,
41-
DriverConfiguration $driverConfiguration,
4239
?DatabaseInfo $databaseInfo
4340
) {
4441
$this->serverAgent = $serverAgent;
4542
$this->serverAddress = $serverAddress;
4643
$this->serverVersion = $serverVersion;
4744
$this->protocol = $protocol;
4845
$this->accessMode = $accessMode;
49-
$this->driverConfiguration = $driverConfiguration;
5046
$this->databaseInfo = $databaseInfo;
5147
}
5248

@@ -75,11 +71,6 @@ public function getAccessMode(): AccessMode
7571
return $this->accessMode;
7672
}
7773

78-
public function getDriverConfiguration(): DriverConfiguration
79-
{
80-
return $this->driverConfiguration;
81-
}
82-
8374
public function getDatabaseInfo(): ?DatabaseInfo
8475
{
8576
return $this->databaseInfo;

src/Contracts/ConnectionFactoryInterface.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
namespace Laudis\Neo4j\Contracts;
1313

14-
use Laudis\Neo4j\Bolt\Session;
1514
use Laudis\Neo4j\Databags\SessionConfiguration;
15+
use Laudis\Neo4j\Databags\SslConfiguration;
1616

1717
/**
1818
* @template T
@@ -22,14 +22,14 @@ interface ConnectionFactoryInterface
2222
/**
2323
* @return ConnectionInterface<T>
2424
*/
25-
public function createConnection(AuthenticateInterface $auth, SessionConfiguration $config): ConnectionInterface;
25+
public function createConnection(string $userAgent, SslConfiguration $sslConfig, SessionConfiguration $sessionConfig, AuthenticateInterface $auth): ConnectionInterface;
2626

2727
/**
2828
* @param ConnectionInterface<T> $connection
2929
*
3030
* @return bool
3131
*/
32-
public function canReuseConnection(ConnectionInterface $connection): bool;
32+
public function canReuseConnection(ConnectionInterface $connection, string $userAgent, SslConfiguration $sslConfig, AuthenticateInterface $auth): bool;
3333

3434
/**
3535
* @param ConnectionInterface<T> $connection

src/Contracts/ConnectionInterface.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,11 @@ public function isOpen(): bool;
106106
* @return string
107107
*/
108108
public function getEncryptionLevel(): string;
109+
110+
/**
111+
* Returns the user agent handling this connection.
112+
*
113+
* @return string
114+
*/
115+
public function getUserAgent(): string;
109116
}

0 commit comments

Comments
 (0)