Class: Takagi::Network::Registry

Inherits:
Object
  • Object
show all
Extended by:
Registry::Base
Defined in:
lib/takagi/network/registry.rb

Overview

Registry for transport implementations.

Provides discovery and factory methods for transports. Uses Registry::Base for thread-safe storage and consistent API.

Defined Under Namespace

Classes: TransportNotFoundError

Class Method Summary collapse

Methods included from Registry::Base

[], clear!, count, each, empty?, entries, extended, get, keys, metadata_for, register, registered?, unregister

Class Method Details

.for_scheme(scheme) ⇒ Class?

Find transport for a URI scheme

Examples:

Registry.for_scheme('coap+tcp') # => Network::Tcp

Parameters:

  • scheme (String)

    URI scheme (‘coap’, ‘coap+tcp’, etc.)

Returns:

  • (Class, nil)

    Transport class or nil if not found



35
36
37
38
39
40
41
42
# File 'lib/takagi/network/registry.rb', line 35

def for_scheme(scheme)
  # Get snapshot of transports to avoid holding lock during iteration
  snapshot = @mutex.synchronize { registry.values }

  snapshot.find do |transport|
    transport.scheme == scheme || transport.additional_schemes.include?(scheme)
  end
end

.for_uri(uri) ⇒ Class

Find transport for a URI

Examples:

Registry.for_uri('coap+tcp://localhost:5683') # => Network::Tcp

Parameters:

  • uri (String, URI)

    URI to parse

Returns:

  • (Class)

    Transport class

Raises:



52
53
54
55
56
57
58
# File 'lib/takagi/network/registry.rb', line 52

def for_uri(uri)
  uri = URI(uri) if uri.is_a?(String)
  transport = for_scheme(uri.scheme)
  raise TransportNotFoundError, "No transport for scheme: #{uri.scheme}" unless transport

  transport
end

.register(name, klass, **metadata) ⇒ Object

Register a transport implementation

Examples:

Registry.register(:udp, Network::Udp)
Registry.register(:tcp, Network::Tcp)

Parameters:

  • name (Symbol)

    Transport identifier (:udp, :tcp, :dtls, etc.)

  • klass (Class)

    Transport class inheriting from Network::Base



24
25
26
# File 'lib/takagi/network/registry.rb', line 24

def register(name, klass, **)
  super(name.to_sym, klass, **)
end