Class: Takagi::Server::Udp

Inherits:
Object
  • Object
show all
Defined in:
lib/takagi/server/udp.rb

Overview

UDP server for handling CoAP messages

Instance Method Summary collapse

Constructor Details

#initialize(port: 5683, worker_processes: 2, worker_threads: 2, middleware_stack: nil, router: nil, logger: nil, watcher: nil) ⇒ Udp

Returns a new instance of Udp.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/takagi/server/udp.rb', line 11

def initialize(port: 5683, worker_processes: 2, worker_threads: 2,
               middleware_stack: nil, router: nil, logger: nil, watcher: nil)
  @port = port
  @worker_processes = worker_processes
  @worker_threads = worker_threads
  @middleware_stack = middleware_stack || Takagi::MiddlewareStack.instance
  @router = router || Takagi::Router.instance
  @logger = logger || Takagi.logger
  @watcher = watcher || Takagi::Observer::Watcher.new(interval: 1)

  Initializer.run!

  @socket = UDPSocket.new
  @socket.bind('0.0.0.0', @port)
  Takagi::Network::UdpSender.instance.setup(socket: @socket)
  @sender = Takagi::Network::UdpSender.instance
end

Instance Method Details

#run!Object

Starts the server with multiple worker processes



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/takagi/server/udp.rb', line 30

def run!
  Takagi::Hooks.emit(:server_starting, protocol: :udp, port: @port)
  log_boot_details
  spawn_workers
  Takagi::Observable::Registry.start_all
  @watcher.start

  # Set flag instead of calling shutdown! directly from trap context
  # This avoids "can't be called from trap context" errors with logger
  trap('INT') { @shutdown_requested = true }

  # Wait for workers with periodic checks for shutdown
  until @shutdown_called || @shutdown_requested
    sleep 0.1
  end

  # Call shutdown if it was requested by signal
  shutdown! if @shutdown_requested
end

#shutdown!Object

Gracefully shuts down all workers



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/takagi/server/udp.rb', line 51

def shutdown!
  return if @shutdown_called

  @shutdown_called = true
  @watcher.stop
  close_socket
  terminate_workers
  Takagi::Observable::Registry.stop_all

  # Join the server thread if it was spawned
  if defined?(@server_thread) && @server_thread&.alive?
    @server_thread.join(5) # Wait up to 5 seconds
  end

  exit(0) unless test_environment?
  Takagi::Hooks.emit(:server_stopped, protocol: :udp, port: @port)
end