Wednesday, July 15, 2026 2:12:30 AM
> client_socket.rb
# frozen_string_literal: true

module ESM
  module Arma
    class ClientSocket < Socket
      HEADER_SIZE = 4.bytes
      MAX_READ = 16.megabytes

      def read
        return unless readable?

        length_bytes = @socket.read(HEADER_SIZE)
        return if length_bytes.blank?

        length = length_bytes.unpack1("N")
        raise Exception::MessageTooLarge, length if length >= MAX_READ

        data = @socket.read(length)
        Base64.strict_decode64(data)
      rescue IOError => e
        return if ignored_io_error?(e)

        raise # Re-raise
      rescue => e
        error!(address:, error: e)
        nil
      end

      def write(data)
        raise TypeError, "Expected String, got #{data.class}" unless data.is_a?(String)
        return unless writeable?

        # Encode
        data = Base64.strict_encode64(data)

        # Send
        @socket.write(data)
      rescue TypeError
        raise
      rescue Errno::EPIPE
        close
      rescue => e
        error!(error: e)
      end
    end
  end
end
All opinions represented herein are my own
- © 2024 - 2026 itsthedevman
- build 43aa0d7