Class: LocalDevelopmentGateway::DatabaseRouter::Drivers::PostgreSqlDriver

Inherits:
Object
  • Object
show all
Defined in:
lib/local_development_gateway/database_router/drivers/postgre_sql_driver.rb

Constant Summary collapse

NAME =
"postgresql"
LISTEN_PORT =
5432
SSL_REQUEST =
[8, 80_877_103].pack("NN").freeze

Instance Method Summary collapse

Constructor Details

#initialize(certificate: PostgreSqlCertificate.new) ⇒ PostgreSqlDriver

Returns a new instance of PostgreSqlDriver.



14
15
16
# File 'lib/local_development_gateway/database_router/drivers/postgre_sql_driver.rb', line 14

def initialize(certificate: PostgreSqlCertificate.new)
  @certificate = certificate
end

Instance Method Details

#connect(client, routes, connector:) ⇒ Object

Raises:



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/local_development_gateway/database_router/drivers/postgre_sql_driver.rb', line 26

def connect(client, routes, connector:)
  deadline = DatabaseRouter::Wire.deadline
  request =
    DatabaseRouter::Wire.read_exactly(
      client,
      SSL_REQUEST.bytesize,
      deadline: deadline
    )
  raise Error, "PostgreSQL SSL is required" unless request == SSL_REQUEST
  if routes.empty?
    raise Error, "No labelled postgresql routes are available"
  end

  client.write("S")
  hostname = nil
  context =
    @certificate.context do |_socket, name|
      hostname = name&.downcase
      nil
    end
  tls = OpenSSL::SSL::SSLSocket.new(client, context)
  tls.sync_close = false
  DatabaseRouter::Wire.accept_tls(tls, deadline: deadline)
  unless hostname
    raise Error, "PostgreSQL TLS ClientHello does not contain SNI"
  end

  selected = routes.find { |route| route.hostname == hostname }
  raise Error, "No PostgreSQL route for #{hostname}" unless selected

  [tls, connector.call(selected)]
end

#listen_portObject



22
23
24
# File 'lib/local_development_gateway/database_router/drivers/postgre_sql_driver.rb', line 22

def listen_port
  LISTEN_PORT
end

#nameObject



18
19
20
# File 'lib/local_development_gateway/database_router/drivers/postgre_sql_driver.rb', line 18

def name
  NAME
end