Async::ContainerSourceAsyncContainerNotifyServer

class Server

A simple UDP server that can be used to receive messages from a child process, tracking readiness, status changes, etc.

Nested

Definitions

def self.load(message)

Parse a message, according to the sd_notify protocol.

Signature

parameter message String

The message to parse.

returns Hash

The parsed message.

Implementation

def self.load(message)
	lines = message.split("\n")
	
	lines.pop if lines.last == ""
	
	pairs = lines.map do |line|
		key, value = line.split("=", 2)
		
		key = key.downcase.to_sym
		
		if value == "0"
			value = false
		elsif value == "1"
			value = true
		elsif key == :errno and value =~ /\A\-?\d+\z/
			value = Integer(value)
		end
		
		next [key, value]
	end
	
	return Hash[pairs]
end

def self.generate_path

Generate a new unique path for the UNIX socket.

Signature

returns String

The path for the UNIX socket.

Implementation

def self.generate_path
	File.expand_path(
		"async-container-#{::Process.pid}-#{SecureRandom.hex(8)}.ipc",
		Dir.tmpdir
	)
end

def self.open(path = self.generate_path)

Open a new server instance with a temporary and unique path.

Implementation

def self.open(path = self.generate_path)
	self.new(path)
end

def initialize(path)

Initialize the server with the given path.

Signature

parameter path String

The path to the UNIX socket.

Implementation

def initialize(path)
	@path = path
end

attr :path

Signature

attribute String

The path to the UNIX socket.

def bind

Generate a bound context for receiving messages.

Signature

returns Context

The bound context.

Implementation

def bind
	Context.new(@path)
end