Sha256: 2ff3b80103ce14be33760d0f4cec5b9b98500b70e212fc6bb9b7a3ea59481916

Contents?: true

Size: 1.61 KB

Versions: 4

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2019-2023, by Samuel Williams.
# Copyright, 2019, by Olle Jonsson.
# Copyright, 2023, by Hasan Kumar.

require_relative 'address_endpoint'

module Async
	module IO
		# This class doesn't exert ownership over the specified unix socket and ensures exclusive access by using `flock` where possible.
		class UNIXEndpoint < AddressEndpoint
			def initialize(path, type, **options)
				# I wonder if we should implement chdir behaviour in here if path is longer than 104 characters.
				super(Address.unix(path, type), **options)
				
				@path = path
			end
			
			def to_s
				"\#<#{self.class} #{@path.inspect}>"
			end
			
			attr :path
			
			def bound?
				self.connect do
					return true
				end
			rescue Errno::ECONNREFUSED
				return false
			end
			
			def bind(&block)
				Socket.bind(@address, **@options, &block)
			rescue Errno::EADDRINUSE
				# If you encounter EADDRINUSE from `bind()`, you can check if the socket is actually accepting connections by attempting to `connect()` to it. If the socket is still bound by an active process, the connection will succeed. Otherwise, it should be safe to `unlink()` the path and try again.
				if !bound?
					File.unlink(@path) rescue nil
					retry
				else
					raise
				end
			end
		end
		
		class Endpoint
			# @param path [String]
			# @param type Socket type
			# @param options keyword arguments passed through to {UNIXEndpoint#initialize}
			#
			# @return [UNIXEndpoint]
			def self.unix(path = "", type = ::Socket::SOCK_STREAM, **options)
				UNIXEndpoint.new(path, type, **options)
			end
		end
	end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
async-io-1.43.2 lib/async/io/unix_endpoint.rb
async-io-1.43.1 lib/async/io/unix_endpoint.rb
async-io-1.43.0 lib/async/io/unix_endpoint.rb
async-io-1.42.1 lib/async/io/unix_endpoint.rb