58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # typed: strict
 | |
| # frozen_string_literal: true
 | |
| 
 | |
| require "socket"
 | |
| 
 | |
| module Utils
 | |
|   # Wrapper around UNIXSocket to allow > 104 characters on macOS.
 | |
|   module UNIXSocketExt
 | |
|     extend T::Generic
 | |
| 
 | |
|     sig {
 | |
|       type_parameters(:U).params(
 | |
|         path:   String,
 | |
|         _block: T.proc.params(arg0: UNIXSocket).returns(T.type_parameter(:U)),
 | |
|       ).returns(T.type_parameter(:U))
 | |
|     }
 | |
|     def self.open(path, &_block)
 | |
|       socket = Socket.new(:UNIX, :STREAM)
 | |
|       socket.connect(sockaddr_un(path))
 | |
|       unix_socket = UNIXSocket.for_fd(socket.fileno)
 | |
|       socket.autoclose = false # Transfer autoclose responsibility to UNIXSocket
 | |
|       yield unix_socket
 | |
|     end
 | |
| 
 | |
|     sig { params(path: String).returns(String) }
 | |
|     def self.sockaddr_un(path)
 | |
|       Socket.sockaddr_un(path)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Wrapper around UNIXServer to allow > 104 characters on macOS.
 | |
|   class UNIXServerExt < Socket
 | |
|     extend T::Generic
 | |
| 
 | |
|     Elem = type_member(:out) { { fixed: String } }
 | |
| 
 | |
|     sig { returns(String) }
 | |
|     attr_reader :path
 | |
| 
 | |
|     sig { params(path: String).void }
 | |
|     def initialize(path)
 | |
|       super(:UNIX, :STREAM)
 | |
|       bind(UNIXSocketExt.sockaddr_un(path))
 | |
|       listen(Socket::SOMAXCONN)
 | |
|       @path = path
 | |
|     end
 | |
| 
 | |
|     sig { returns(UNIXSocket) }
 | |
|     def accept_nonblock
 | |
|       socket, = super
 | |
|       socket.autoclose = false # Transfer autoclose responsibility to UNIXSocket
 | |
|       UNIXSocket.for_fd(socket.fileno)
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| require "extend/os/utils/socket"
 | 
