glottis 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +19 -0
- data/README.md +26 -5
- data/Rakefile +6 -1
- data/exe/glottis +2 -0
- data/glottis.gemspec +19 -10
- data/lib/glottis/client.rb +21 -9
- data/lib/glottis/exceptions/glottis_exception.rb +3 -0
- data/lib/glottis/exceptions/user_exited_exception.rb +3 -0
- data/lib/glottis/handlers/console_input_handler.rb +36 -18
- data/lib/glottis/handlers/console_output_handler.rb +33 -13
- data/lib/glottis/handlers/remote_input_handler.rb +49 -15
- data/lib/glottis/handlers/remote_output_handler.rb +30 -17
- data/lib/glottis/version.rb +3 -1
- data/lib/glottis.rb +3 -0
- metadata +26 -31
- data/.gitignore +0 -11
- data/.rubocop.yml +0 -5
- data/.travis.yml +0 -4
- data/Gemfile +0 -4
- data/bin/console +0 -7
- data/bin/setup +0 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: c4738a04eaf3d36ff79c3b8b18e9408d825729e40a2314f76049aeb848e9fb23
|
|
4
|
+
data.tar.gz: 3bc4629dfdb5dbc0b9d55b78369fb4f5be2dc9032a0ac1b5b2f922fdff4b7a6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8b36bbc01a00d869a1bd91f58ccc31348332244896e6bca5b6c2c2ba96ce8c1cdb8a16254a50fe4a4c005cc6b3d79a97f789bae8b4c01d6e084aa497f9bb4081
|
|
7
|
+
data.tar.gz: 74dcce5991937a677eddbe3ebd51de4f792cd0c47ecff50f4d606288fe12c880ef36b9e9c280de8c7f269bf1e82a50248b0d894e38c34b2be2924ad4de3b6070
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semmle.com/semver/1.0.0/).
|
|
7
|
+
|
|
8
|
+
## [0.3.0] - 2026-07-24
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- Bumped required Ruby version to `>= 3.0.0`.
|
|
12
|
+
- Removed `rb-readline` dependency in favor of Ruby standard library `reline`/`readline`.
|
|
13
|
+
- Updated `slop` runtime dependency to `~> 4.10`.
|
|
14
|
+
- Modernized gemspec metadata and file list configuration.
|
|
15
|
+
- Updated RuboCop configuration for Ruby 3.0+ compatibility (`Layout/LineLength`).
|
|
16
|
+
- Migrated CI from Travis CI to GitHub Actions (`.github/workflows/ci.yml`).
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- Comprehensive RSpec test suite covering core client and handlers.
|
data/README.md
CHANGED
|
@@ -2,26 +2,47 @@
|
|
|
2
2
|
|
|
3
3
|
A CLI for the [valyx](https://github.com/maxdeliso/valyx) message passing server.
|
|
4
4
|
|
|
5
|
+
[](https://github.com/maxdeliso/glottis/actions/workflows/ci.yml)
|
|
6
|
+
[](https://badge.fury.io/rb/glottis)
|
|
7
|
+
|
|
8
|
+
## Requirements
|
|
9
|
+
|
|
10
|
+
- Ruby >= 3.0.0
|
|
11
|
+
|
|
5
12
|
## Installation
|
|
6
13
|
|
|
14
|
+
Install the gem by executing:
|
|
15
|
+
|
|
7
16
|
$ gem install glottis
|
|
8
17
|
|
|
18
|
+
Or add it to your application's Gemfile:
|
|
19
|
+
|
|
20
|
+
$ gem 'glottis', '~> 0.3'
|
|
21
|
+
|
|
9
22
|
## Usage
|
|
10
23
|
|
|
11
|
-
|
|
24
|
+
Run the `glottis` command-line executable:
|
|
25
|
+
|
|
26
|
+
$ glottis --host localhost --port 8080
|
|
27
|
+
|
|
28
|
+
For help and available command line flags:
|
|
29
|
+
|
|
30
|
+
$ glottis --help
|
|
12
31
|
|
|
13
32
|
## Development
|
|
14
33
|
|
|
15
|
-
To
|
|
34
|
+
To run the test suite and linter:
|
|
16
35
|
|
|
17
|
-
|
|
36
|
+
$ bundle exec rake
|
|
18
37
|
|
|
19
38
|
To install this gem onto your local machine:
|
|
20
39
|
|
|
21
|
-
|
|
40
|
+
$ bundle exec rake install
|
|
22
41
|
|
|
23
42
|
## Contributing
|
|
24
43
|
|
|
25
44
|
Bug reports and pull requests are welcome on GitHub at https://github.com/maxdeliso/glottis.
|
|
26
45
|
|
|
27
|
-
|
|
46
|
+
## License
|
|
47
|
+
|
|
48
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'bundler/gem_tasks'
|
|
2
4
|
require 'rubocop/rake_task'
|
|
5
|
+
require 'rspec/core/rake_task'
|
|
3
6
|
|
|
4
7
|
RuboCop::RakeTask.new(:rubocop)
|
|
8
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
9
|
+
|
|
10
|
+
task default: %i[rubocop spec]
|
|
5
11
|
|
|
6
|
-
task default: [:rubocop]
|
data/exe/glottis
CHANGED
data/glottis.gemspec
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
5
|
require 'glottis/version'
|
|
5
6
|
|
|
@@ -11,19 +12,27 @@ Gem::Specification.new do |spec|
|
|
|
11
12
|
spec.licenses = ['MIT']
|
|
12
13
|
spec.summary = 'simple http messaging client'
|
|
13
14
|
spec.homepage = 'https://github.com/maxdeliso/glottis'
|
|
15
|
+
spec.required_ruby_version = '>= 3.0.0'
|
|
16
|
+
|
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/maxdeliso/glottis'
|
|
19
|
+
spec.metadata['changelog_uri'] = 'https://github.com/maxdeliso/glottis/blob/main/CHANGELOG.md'
|
|
20
|
+
spec.metadata['bug_tracker_uri'] = 'https://github.com/maxdeliso/glottis/issues'
|
|
21
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
14
22
|
|
|
15
|
-
spec.files =
|
|
16
|
-
|
|
17
|
-
end
|
|
23
|
+
spec.files = Dir.glob('{exe,lib}/**/*') + %w[Rakefile README.md CHANGELOG.md glottis.gemspec]
|
|
24
|
+
spec.files = spec.files.select { |f| File.file?(f) }
|
|
18
25
|
|
|
19
26
|
spec.bindir = 'exe'
|
|
20
27
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
21
28
|
spec.require_paths = ['lib']
|
|
22
29
|
|
|
23
|
-
spec.add_runtime_dependency '
|
|
24
|
-
spec.add_runtime_dependency 'slop', '~> 4.2'
|
|
30
|
+
spec.add_runtime_dependency 'slop', '~> 4.10'
|
|
25
31
|
|
|
26
|
-
spec.add_development_dependency 'bundler', '~>
|
|
27
|
-
spec.add_development_dependency 'rake', '~>
|
|
28
|
-
spec.add_development_dependency '
|
|
32
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
|
33
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
|
34
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 1.0'
|
|
29
36
|
end
|
|
37
|
+
|
|
38
|
+
|
data/lib/glottis/client.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'logger'
|
|
3
4
|
require 'glottis/handlers/console_input_handler'
|
|
4
5
|
require 'glottis/handlers/console_output_handler'
|
|
@@ -6,10 +7,10 @@ require 'glottis/handlers/remote_input_handler'
|
|
|
6
7
|
require 'glottis/handlers/remote_output_handler'
|
|
7
8
|
|
|
8
9
|
module Glottis
|
|
9
|
-
# Client class
|
|
10
|
+
# Client class used to interact with the specified host and port.
|
|
10
11
|
class Client
|
|
11
12
|
def self.logger
|
|
12
|
-
@logger ||= Logger.new(
|
|
13
|
+
@logger ||= Logger.new($stdout)
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def initialize(host, port, opts = {})
|
|
@@ -17,12 +18,12 @@ module Glottis
|
|
|
17
18
|
@port = port
|
|
18
19
|
@outgoing = Queue.new
|
|
19
20
|
@incoming = Queue.new
|
|
21
|
+
@handlers = []
|
|
20
22
|
Client.logger.level = opts[:verbose] ? Logger::DEBUG : Logger::WARN
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def run
|
|
24
26
|
Client.logger.info('starting...')
|
|
25
|
-
Thread.abort_on_exception = true
|
|
26
27
|
|
|
27
28
|
@handlers = [
|
|
28
29
|
Handlers::ConsoleInputHandler.new(@outgoing),
|
|
@@ -31,14 +32,25 @@ module Glottis
|
|
|
31
32
|
Handlers::RemoteOutputHandler.new(@outgoing, @host, @port)
|
|
32
33
|
]
|
|
33
34
|
|
|
35
|
+
@handlers.each(&:start)
|
|
34
36
|
@handlers.each(&:join)
|
|
37
|
+
rescue Glottis::Exceptions::UserExitedException
|
|
38
|
+
Client.logger.info('User exited.')
|
|
39
|
+
rescue Interrupt
|
|
40
|
+
Client.logger.info('Received interrupt signal. Exiting...')
|
|
35
41
|
rescue Errno::ECONNREFUSED => conn_ref
|
|
36
|
-
Client.logger.error("
|
|
42
|
+
Client.logger.error("Failed to connect to host: #{conn_ref.message}")
|
|
37
43
|
rescue StandardError => ex
|
|
38
|
-
Client.logger.warn("
|
|
44
|
+
Client.logger.warn("Shutting down due to error: #{ex.message}")
|
|
39
45
|
ensure
|
|
46
|
+
stop_handlers
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def stop_handlers
|
|
40
52
|
@handlers.each(&:cleanup)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
end # Client
|
|
53
|
+
end
|
|
54
|
+
end
|
|
44
55
|
end
|
|
56
|
+
|
|
@@ -1,32 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'glottis/exceptions/user_exited_exception'
|
|
2
4
|
require 'readline'
|
|
3
5
|
|
|
4
6
|
module Glottis
|
|
5
7
|
module Handlers
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
USER_PROMPT = '> '.freeze
|
|
8
|
+
# Holds a reference to the outgoing message queue and posts console input.
|
|
9
|
+
class ConsoleInputHandler
|
|
10
|
+
USER_PROMPT = '> '
|
|
10
11
|
|
|
11
12
|
def initialize(outgoing)
|
|
12
13
|
@outgoing = outgoing
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Readline::HISTORY.push(user_input)
|
|
14
|
+
@running = false
|
|
15
|
+
@thread = nil
|
|
16
|
+
end
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
def start
|
|
19
|
+
@running = true
|
|
20
|
+
@thread = Thread.new { run_loop }
|
|
21
|
+
self
|
|
22
|
+
end
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
end
|
|
24
|
+
def join
|
|
25
|
+
@thread&.join
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
def cleanup
|
|
28
|
-
|
|
29
|
+
@running = false
|
|
30
|
+
@thread&.kill if @thread&.alive?
|
|
29
31
|
end
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def run_loop
|
|
36
|
+
while @running
|
|
37
|
+
user_input = Readline.readline(USER_PROMPT, true)
|
|
38
|
+
|
|
39
|
+
raise Glottis::Exceptions::UserExitedException, 'User exited readline stream' if user_input.nil?
|
|
40
|
+
|
|
41
|
+
@outgoing.push(user_input)
|
|
42
|
+
end
|
|
43
|
+
rescue Glottis::Exceptions::UserExitedException => ex
|
|
44
|
+
Client.logger.info("Console input ended: #{ex.message}")
|
|
45
|
+
raise ex
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
@@ -1,21 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Glottis
|
|
2
4
|
module Handlers
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
class ConsoleOutputHandler < Thread
|
|
5
|
+
# Holds a reference to incoming message queue and prints messages to stdout.
|
|
6
|
+
class ConsoleOutputHandler
|
|
6
7
|
def initialize(incoming)
|
|
7
8
|
@incoming = incoming
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
@running = false
|
|
10
|
+
@thread = nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def start
|
|
14
|
+
@running = true
|
|
15
|
+
@thread = Thread.new { run_loop }
|
|
16
|
+
self
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def join
|
|
20
|
+
@thread&.join
|
|
14
21
|
end
|
|
15
22
|
|
|
16
23
|
def cleanup
|
|
17
|
-
|
|
24
|
+
@running = false
|
|
25
|
+
@thread&.kill if @thread&.alive?
|
|
18
26
|
end
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def run_loop
|
|
31
|
+
while @running
|
|
32
|
+
new_msg = @incoming.pop
|
|
33
|
+
break if new_msg.nil? || new_msg == :shutdown
|
|
34
|
+
|
|
35
|
+
puts "#{new_msg['from']}, #{new_msg['to']}, #{new_msg['msg']}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'logger'
|
|
2
4
|
require 'uri'
|
|
3
5
|
require 'net/http'
|
|
@@ -5,11 +7,11 @@ require 'json'
|
|
|
5
7
|
|
|
6
8
|
module Glottis
|
|
7
9
|
module Handlers
|
|
8
|
-
#
|
|
9
|
-
class RemoteInputHandler
|
|
10
|
-
PROTOCOL = 'http'
|
|
11
|
-
STREAM_DELIMITER = "\0"
|
|
12
|
-
READ_TIMEOUT = 3600
|
|
10
|
+
# Manages stream input from the remote valyx server.
|
|
11
|
+
class RemoteInputHandler
|
|
12
|
+
PROTOCOL = 'http'
|
|
13
|
+
STREAM_DELIMITER = "\0"
|
|
14
|
+
READ_TIMEOUT = 3600
|
|
13
15
|
REMOTE_PATHS = {
|
|
14
16
|
get_message_stream: '/api/messages/stream'
|
|
15
17
|
}.freeze
|
|
@@ -18,17 +20,29 @@ module Glottis
|
|
|
18
20
|
@incoming = incoming
|
|
19
21
|
@host = host
|
|
20
22
|
@port = port
|
|
21
|
-
|
|
23
|
+
@running = false
|
|
24
|
+
@thread = nil
|
|
25
|
+
@buffer = String.new
|
|
22
26
|
setup_http
|
|
27
|
+
end
|
|
23
28
|
|
|
24
|
-
|
|
29
|
+
def start
|
|
30
|
+
@running = true
|
|
31
|
+
@thread = Thread.new do
|
|
25
32
|
@http.start
|
|
26
33
|
read_loop
|
|
27
34
|
end
|
|
35
|
+
self
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def join
|
|
39
|
+
@thread&.join
|
|
28
40
|
end
|
|
29
41
|
|
|
30
42
|
def cleanup
|
|
43
|
+
@running = false
|
|
31
44
|
@http.finish if @http.started?
|
|
45
|
+
@thread&.kill if @thread&.alive?
|
|
32
46
|
end
|
|
33
47
|
|
|
34
48
|
private
|
|
@@ -42,12 +56,32 @@ module Glottis
|
|
|
42
56
|
def read_loop
|
|
43
57
|
Client.logger.info('reading stream...')
|
|
44
58
|
@http.get(REMOTE_PATHS.fetch(:get_message_stream)) do |chunk|
|
|
59
|
+
break unless @running
|
|
60
|
+
|
|
45
61
|
Client.logger.debug("got chunk of length: #{chunk.length}")
|
|
46
|
-
chunk
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
process_chunk(chunk)
|
|
63
|
+
end
|
|
64
|
+
rescue StandardError => ex
|
|
65
|
+
Client.logger.error("Error reading message stream: #{ex.message}") if @running
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def process_chunk(chunk)
|
|
69
|
+
@buffer << chunk
|
|
70
|
+
|
|
71
|
+
while (delimiter_index = @buffer.index(STREAM_DELIMITER))
|
|
72
|
+
msg_raw = @buffer.slice!(0..delimiter_index)
|
|
73
|
+
msg_data = msg_raw.chomp(STREAM_DELIMITER)
|
|
74
|
+
next if msg_data.empty?
|
|
75
|
+
|
|
76
|
+
begin
|
|
77
|
+
parsed_msg = JSON.parse(msg_data)
|
|
78
|
+
@incoming.push(parsed_msg)
|
|
79
|
+
rescue JSON::ParserError => err
|
|
80
|
+
Client.logger.warn("Failed to parse JSON payload: #{err.message}")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'logger'
|
|
2
4
|
require 'uri'
|
|
3
5
|
require 'net/http'
|
|
@@ -5,10 +7,10 @@ require 'json'
|
|
|
5
7
|
|
|
6
8
|
module Glottis
|
|
7
9
|
module Handlers
|
|
8
|
-
#
|
|
9
|
-
class RemoteOutputHandler
|
|
10
|
+
# Manages posting outgoing messages to the remote valyx server.
|
|
11
|
+
class RemoteOutputHandler
|
|
10
12
|
POLL_INTERVAL = 0.1
|
|
11
|
-
PROTOCOL = 'http'
|
|
13
|
+
PROTOCOL = 'http'
|
|
12
14
|
|
|
13
15
|
REMOTE_PATHS = {
|
|
14
16
|
get_session: '/api/session',
|
|
@@ -19,28 +21,39 @@ module Glottis
|
|
|
19
21
|
@outgoing = outgoing
|
|
20
22
|
@host = host
|
|
21
23
|
@port = port
|
|
22
|
-
|
|
24
|
+
@running = false
|
|
25
|
+
@thread = nil
|
|
26
|
+
@sid = nil
|
|
23
27
|
setup_http
|
|
28
|
+
end
|
|
24
29
|
|
|
25
|
-
|
|
30
|
+
def start
|
|
31
|
+
@running = true
|
|
32
|
+
@thread = Thread.new do
|
|
26
33
|
@http.start
|
|
27
34
|
request_session
|
|
28
35
|
|
|
29
|
-
|
|
36
|
+
while @running
|
|
30
37
|
send_queued
|
|
31
38
|
end
|
|
32
39
|
end
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def join
|
|
44
|
+
@thread&.join
|
|
33
45
|
end
|
|
34
46
|
|
|
35
47
|
def cleanup
|
|
48
|
+
@running = false
|
|
36
49
|
@http.finish if @http.started?
|
|
50
|
+
@thread&.kill if @thread&.alive?
|
|
37
51
|
end
|
|
38
52
|
|
|
39
53
|
private
|
|
40
54
|
|
|
41
55
|
def setup_http
|
|
42
56
|
@http = Net::HTTP.new(@host, @port)
|
|
43
|
-
# TODO: make these configurable somewhere
|
|
44
57
|
@http.open_timeout = 1
|
|
45
58
|
@http.read_timeout = 1
|
|
46
59
|
end
|
|
@@ -49,7 +62,6 @@ module Glottis
|
|
|
49
62
|
Client.logger.info('making initial request for session...')
|
|
50
63
|
|
|
51
64
|
session_req = @http.get(REMOTE_PATHS.fetch(:get_session))
|
|
52
|
-
|
|
53
65
|
response = JSON.parse(session_req.body)
|
|
54
66
|
|
|
55
67
|
if Integer(session_req.code) != 201
|
|
@@ -60,20 +72,20 @@ module Glottis
|
|
|
60
72
|
Client.logger.info("current session id: #{@sid}")
|
|
61
73
|
end
|
|
62
74
|
|
|
63
|
-
|
|
64
|
-
# and executes the (side effecting) block if the response was not
|
|
65
|
-
# successful. calls the block with a message describing the error.
|
|
66
|
-
def if_not_ok(http_req, ok_code = 200, &_b)
|
|
75
|
+
def if_not_ok(http_req, ok_code = 200)
|
|
67
76
|
yield http_req.body if Integer(http_req.code) != ok_code
|
|
68
77
|
end
|
|
69
78
|
|
|
70
79
|
def send_queued
|
|
80
|
+
raw_msg = @outgoing.pop
|
|
81
|
+
return if raw_msg.nil? || raw_msg == :shutdown
|
|
82
|
+
|
|
71
83
|
Client.logger.info("processing message with #{@outgoing.size} messages outgoing")
|
|
72
84
|
|
|
73
85
|
message_data = {
|
|
74
86
|
from: @sid,
|
|
75
87
|
to: '*',
|
|
76
|
-
msg:
|
|
88
|
+
msg: raw_msg
|
|
77
89
|
}.to_json
|
|
78
90
|
|
|
79
91
|
post_req = @http.post(REMOTE_PATHS.fetch(:post_message), message_data)
|
|
@@ -81,7 +93,8 @@ module Glottis
|
|
|
81
93
|
if_not_ok(post_req) do |err|
|
|
82
94
|
Client.logger.warn("failed to post message: #{message_data} #{err}")
|
|
83
95
|
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
data/lib/glottis/version.rb
CHANGED
data/lib/glottis.rb
CHANGED
metadata
CHANGED
|
@@ -1,86 +1,84 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: glottis
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Max DeLiso
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: exe
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
13
|
+
name: slop
|
|
15
14
|
requirement: !ruby/object:Gem::Requirement
|
|
16
15
|
requirements:
|
|
17
16
|
- - "~>"
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
18
|
+
version: '4.10'
|
|
20
19
|
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - "~>"
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
25
|
+
version: '4.10'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
27
|
+
name: bundler
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - "~>"
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
34
|
-
type: :
|
|
32
|
+
version: '2.0'
|
|
33
|
+
type: :development
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - "~>"
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
39
|
+
version: '2.0'
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
41
|
+
name: rake
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
44
43
|
requirements:
|
|
45
44
|
- - "~>"
|
|
46
45
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
46
|
+
version: '13.0'
|
|
48
47
|
type: :development
|
|
49
48
|
prerelease: false
|
|
50
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
50
|
requirements:
|
|
52
51
|
- - "~>"
|
|
53
52
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
53
|
+
version: '13.0'
|
|
55
54
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
55
|
+
name: rspec
|
|
57
56
|
requirement: !ruby/object:Gem::Requirement
|
|
58
57
|
requirements:
|
|
59
58
|
- - "~>"
|
|
60
59
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: '
|
|
60
|
+
version: '3.0'
|
|
62
61
|
type: :development
|
|
63
62
|
prerelease: false
|
|
64
63
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
64
|
requirements:
|
|
66
65
|
- - "~>"
|
|
67
66
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: '
|
|
67
|
+
version: '3.0'
|
|
69
68
|
- !ruby/object:Gem::Dependency
|
|
70
69
|
name: rubocop
|
|
71
70
|
requirement: !ruby/object:Gem::Requirement
|
|
72
71
|
requirements:
|
|
73
72
|
- - "~>"
|
|
74
73
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: 0
|
|
74
|
+
version: '1.0'
|
|
76
75
|
type: :development
|
|
77
76
|
prerelease: false
|
|
78
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
78
|
requirements:
|
|
80
79
|
- - "~>"
|
|
81
80
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: 0
|
|
83
|
-
description:
|
|
81
|
+
version: '1.0'
|
|
84
82
|
email:
|
|
85
83
|
- maxdeliso@gmail.com
|
|
86
84
|
executables:
|
|
@@ -88,14 +86,9 @@ executables:
|
|
|
88
86
|
extensions: []
|
|
89
87
|
extra_rdoc_files: []
|
|
90
88
|
files:
|
|
91
|
-
-
|
|
92
|
-
- ".rubocop.yml"
|
|
93
|
-
- ".travis.yml"
|
|
94
|
-
- Gemfile
|
|
89
|
+
- CHANGELOG.md
|
|
95
90
|
- README.md
|
|
96
91
|
- Rakefile
|
|
97
|
-
- bin/console
|
|
98
|
-
- bin/setup
|
|
99
92
|
- exe/glottis
|
|
100
93
|
- glottis.gemspec
|
|
101
94
|
- lib/glottis.rb
|
|
@@ -110,8 +103,12 @@ files:
|
|
|
110
103
|
homepage: https://github.com/maxdeliso/glottis
|
|
111
104
|
licenses:
|
|
112
105
|
- MIT
|
|
113
|
-
metadata:
|
|
114
|
-
|
|
106
|
+
metadata:
|
|
107
|
+
homepage_uri: https://github.com/maxdeliso/glottis
|
|
108
|
+
source_code_uri: https://github.com/maxdeliso/glottis
|
|
109
|
+
changelog_uri: https://github.com/maxdeliso/glottis/blob/main/CHANGELOG.md
|
|
110
|
+
bug_tracker_uri: https://github.com/maxdeliso/glottis/issues
|
|
111
|
+
rubygems_mfa_required: 'true'
|
|
115
112
|
rdoc_options: []
|
|
116
113
|
require_paths:
|
|
117
114
|
- lib
|
|
@@ -119,16 +116,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
119
116
|
requirements:
|
|
120
117
|
- - ">="
|
|
121
118
|
- !ruby/object:Gem::Version
|
|
122
|
-
version:
|
|
119
|
+
version: 3.0.0
|
|
123
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
121
|
requirements:
|
|
125
122
|
- - ">="
|
|
126
123
|
- !ruby/object:Gem::Version
|
|
127
124
|
version: '0'
|
|
128
125
|
requirements: []
|
|
129
|
-
|
|
130
|
-
rubygems_version: 2.4.5.1
|
|
131
|
-
signing_key:
|
|
126
|
+
rubygems_version: 3.6.7
|
|
132
127
|
specification_version: 4
|
|
133
128
|
summary: simple http messaging client
|
|
134
129
|
test_files: []
|
data/.gitignore
DELETED
data/.rubocop.yml
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/bin/console
DELETED