Sha256: 8855fefe28492552c3ff545c3dc8defbf4efc003cfed604f53e38e0715fa94e8

Contents?: true

Size: 1.14 KB

Versions: 7

Compression:

Stored size: 1.14 KB

Contents

# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2020-2022, by Samuel Williams.

require 'json'

module Async
	module Container
		# Provides a basic multi-thread/multi-process uni-directional communication channel.
		class Channel
			# Initialize the channel using a pipe.
			def initialize
				@in, @out = ::IO.pipe
			end
			
			# The input end of the pipe.
			# @attribute [IO]
			attr :in
			
			# The output end of the pipe.
			# @attribute [IO]
			attr :out
			
			# Close the input end of the pipe.
			def close_read
				@in.close
			end
			
			# Close the output end of the pipe.
			def close_write
				@out.close
			end
			
			# Close both ends of the pipe.
			def close
				close_read
				close_write
			end
			
			# Receive an object from the pipe.
			# Internally, prefers to receive newline formatted JSON, otherwise returns a hash table with a single key `:line` which contains the line of data that could not be parsed as JSON.
			# @returns [Hash]
			def receive
				if data = @in.gets
					begin
						return JSON.parse(data, symbolize_names: true)
					rescue
						return {line: data}
					end
				end
			end
		end
	end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
async-container-0.18.3 lib/async/container/channel.rb
async-container-0.18.2 lib/async/container/channel.rb
async-container-0.18.1 lib/async/container/channel.rb
async-container-0.18.0 lib/async/container/channel.rb
async-container-0.17.1 lib/async/container/channel.rb
async-container-0.17.0 lib/async/container/channel.rb
async-container-0.16.13 lib/async/container/channel.rb