glottis 0.1.2 → 0.1.3
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 +4 -4
- data/.gitignore +11 -11
- data/.rubocop.yml +4 -4
- data/.travis.yml +4 -4
- data/Gemfile +4 -4
- data/README.md +27 -21
- data/Rakefile +6 -1
- data/bin/console +7 -7
- data/bin/setup +7 -7
- data/exe/glottis +22 -22
- data/glottis.gemspec +29 -30
- data/lib/glottis.rb +2 -2
- data/lib/glottis/client.rb +44 -46
- data/lib/glottis/exceptions/glottis_exception.rb +6 -6
- data/lib/glottis/exceptions/user_exited_exception.rb +8 -8
- data/lib/glottis/handlers/console_input_handler.rb +32 -32
- data/lib/glottis/handlers/console_output_handler.rb +21 -21
- data/lib/glottis/handlers/remote_input_handler.rb +53 -53
- data/lib/glottis/handlers/remote_output_handler.rb +87 -107
- data/lib/glottis/version.rb +3 -4
- metadata +4 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a42b6e38fd2d75e8acbdc2dcf338453c34b69c7
|
4
|
+
data.tar.gz: 189a29629e5104997a16071815febe031ee1e794
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cffde427455b740691132995a39ac6c1071a23f19bcef3744971958d414967c13ea4c9f28dabd521eef21dda5c074951dd311ee109ac81c6c4420514e1c253d
|
7
|
+
data.tar.gz: 22dd5726fef0948fd4c114dddaa52c02a01699bbbcbe155e15622fc0c7f2b59474ae2bbf2689cbc133fdba2590c0e2ff97bc7ec602d468d67749bf9dc15a5eab
|
data/.gitignore
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
/.bundle/
|
2
|
-
/.yardoc
|
3
|
-
/Gemfile.lock
|
4
|
-
/_yardoc/
|
5
|
-
/coverage/
|
6
|
-
/doc/
|
7
|
-
/pkg/
|
8
|
-
/spec/reports/
|
9
|
-
/tmp/
|
10
|
-
*.log
|
11
|
-
*.gem
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
*.log
|
11
|
+
*.gem
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
Metrics/LineLength:
|
2
|
-
Max: 99
|
3
|
-
|
4
|
-
Metrics/MethodLength:
|
1
|
+
Metrics/LineLength:
|
2
|
+
Max: 99
|
3
|
+
|
4
|
+
Metrics/MethodLength:
|
5
5
|
Max: 20
|
data/.travis.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.1.5
|
4
|
-
before_install: gem install bundler -v 1.10.6
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.1.5
|
4
|
+
before_install: gem install bundler -v 1.10.6
|
data/Gemfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in glottis.gemspec
|
4
|
-
gemspec
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in glottis.gemspec
|
4
|
+
gemspec
|
data/README.md
CHANGED
@@ -1,21 +1,27 @@
|
|
1
|
-
# glottis
|
2
|
-
|
3
|
-
A CLI for the [valyx](https://github.com/maxdeliso/valyx) message passing server.
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
$ gem install glottis
|
8
|
-
|
9
|
-
## Usage
|
10
|
-
|
11
|
-
$ glottis -h
|
12
|
-
|
13
|
-
## Development
|
14
|
-
|
15
|
-
To
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
1
|
+
# glottis
|
2
|
+
|
3
|
+
A CLI for the [valyx](https://github.com/maxdeliso/valyx) message passing server.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
$ gem install glottis
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
$ glottis -h
|
12
|
+
|
13
|
+
## Development
|
14
|
+
|
15
|
+
To check the code:
|
16
|
+
|
17
|
+
$ bundle exec rake
|
18
|
+
|
19
|
+
To install this gem onto your local machine:
|
20
|
+
|
21
|
+
$ bundle exec rake install
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/maxdeliso/glottis.
|
26
|
+
|
27
|
+
[](https://badge.fury.io/rb/glottis)
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'glottis'
|
5
|
-
require 'irb'
|
6
|
-
|
7
|
-
IRB.start
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'glottis'
|
5
|
+
require 'irb'
|
6
|
+
|
7
|
+
IRB.start
|
data/bin/setup
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
set -euo pipefail
|
3
|
-
IFS=$'\n\t'
|
4
|
-
|
5
|
-
bundle install
|
6
|
-
|
7
|
-
# Do any other automated setup that you need to do here
|
1
|
+
#!/bin/bash
|
2
|
+
set -euo pipefail
|
3
|
+
IFS=$'\n\t'
|
4
|
+
|
5
|
+
bundle install
|
6
|
+
|
7
|
+
# Do any other automated setup that you need to do here
|
data/exe/glottis
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'slop'
|
4
|
-
require 'glottis'
|
5
|
-
|
6
|
-
opts = Slop.parse do |o|
|
7
|
-
o.string '--host', 'a hostname', default: 'localhost'
|
8
|
-
o.integer '--port', 'TCP port', default: 8080
|
9
|
-
o.bool '-v', '--verbose', 'enable verbose mode'
|
10
|
-
o.on '-V', '--version', 'print the version' do
|
11
|
-
puts "glottis #{Glottis::VERSION}"
|
12
|
-
exit
|
13
|
-
end
|
14
|
-
o.on '-h', '--help' do
|
15
|
-
puts o
|
16
|
-
exit
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
Glottis::Client.new(opts[:host],
|
21
|
-
opts[:port],
|
22
|
-
verbose: opts[:verbose]).run
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'slop'
|
4
|
+
require 'glottis'
|
5
|
+
|
6
|
+
opts = Slop.parse do |o|
|
7
|
+
o.string '--host', 'a hostname', default: 'localhost'
|
8
|
+
o.integer '--port', 'TCP port', default: 8080
|
9
|
+
o.bool '-v', '--verbose', 'enable verbose mode'
|
10
|
+
o.on '-V', '--version', 'print the version' do
|
11
|
+
puts "glottis #{Glottis::VERSION}"
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
o.on '-h', '--help' do
|
15
|
+
puts o
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Glottis::Client.new(opts[:host],
|
21
|
+
opts[:port],
|
22
|
+
verbose: opts[:verbose]).run
|
data/glottis.gemspec
CHANGED
@@ -1,30 +1,29 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'glottis/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = 'glottis'
|
8
|
-
spec.version = Glottis::VERSION
|
9
|
-
spec.authors = ['Max DeLiso']
|
10
|
-
spec.email = ['maxdeliso@gmail.com']
|
11
|
-
spec.licenses = ['MIT']
|
12
|
-
spec.summary = 'simple http messaging client'
|
13
|
-
spec.homepage = 'https://github.com/maxdeliso/glottis'
|
14
|
-
|
15
|
-
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
16
|
-
f.match(%r{^(test|spec|features)/})
|
17
|
-
end
|
18
|
-
|
19
|
-
spec.bindir = 'exe'
|
20
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
-
spec.require_paths = ['lib']
|
22
|
-
|
23
|
-
spec.add_runtime_dependency 'rb-readline', '~> 0.5.3'
|
24
|
-
spec.add_runtime_dependency 'slop', '~> 4.2'
|
25
|
-
|
26
|
-
spec.add_development_dependency 'bundler', '~> 1.10'
|
27
|
-
spec.add_development_dependency '
|
28
|
-
spec.add_development_dependency '
|
29
|
-
|
30
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'glottis/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'glottis'
|
8
|
+
spec.version = Glottis::VERSION
|
9
|
+
spec.authors = ['Max DeLiso']
|
10
|
+
spec.email = ['maxdeliso@gmail.com']
|
11
|
+
spec.licenses = ['MIT']
|
12
|
+
spec.summary = 'simple http messaging client'
|
13
|
+
spec.homepage = 'https://github.com/maxdeliso/glottis'
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
17
|
+
end
|
18
|
+
|
19
|
+
spec.bindir = 'exe'
|
20
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ['lib']
|
22
|
+
|
23
|
+
spec.add_runtime_dependency 'rb-readline', '~> 0.5.3'
|
24
|
+
spec.add_runtime_dependency 'slop', '~> 4.2'
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
27
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 0.37.2'
|
29
|
+
end
|
data/lib/glottis.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require 'glottis/version'
|
2
|
-
require 'glottis/client'
|
1
|
+
require 'glottis/version'
|
2
|
+
require 'glottis/client'
|
data/lib/glottis/client.rb
CHANGED
@@ -1,46 +1,44 @@
|
|
1
|
-
require 'thread'
|
2
|
-
require 'logger'
|
3
|
-
require 'glottis/handlers/console_input_handler'
|
4
|
-
require 'glottis/handlers/console_output_handler'
|
5
|
-
require 'glottis/handlers/remote_input_handler'
|
6
|
-
require 'glottis/handlers/remote_output_handler'
|
7
|
-
|
8
|
-
module Glottis
|
9
|
-
# Client class, used to interact with the host specified.
|
10
|
-
class Client
|
11
|
-
def self.logger
|
12
|
-
@logger ||= Logger.new(STDOUT)
|
13
|
-
end
|
14
|
-
|
15
|
-
def initialize(host, port, opts = {})
|
16
|
-
@host = host
|
17
|
-
@port = port
|
18
|
-
@outgoing = Queue.new
|
19
|
-
@incoming = Queue.new
|
20
|
-
Client.logger.level = opts[:verbose] ? Logger::DEBUG : Logger::WARN
|
21
|
-
end
|
22
|
-
|
23
|
-
def run
|
24
|
-
Client.logger.info('starting...')
|
25
|
-
Thread.abort_on_exception = true
|
26
|
-
|
27
|
-
@handlers = [
|
28
|
-
Handlers::ConsoleInputHandler.new(@outgoing),
|
29
|
-
Handlers::ConsoleOutputHandler.new(@incoming),
|
30
|
-
Handlers::RemoteInputHandler.new(@incoming, @host, @port),
|
31
|
-
Handlers::RemoteOutputHandler.new(@outgoing, @host, @port)
|
32
|
-
]
|
33
|
-
|
34
|
-
@handlers.each(&:join)
|
35
|
-
rescue
|
36
|
-
Client.logger.
|
37
|
-
rescue
|
38
|
-
Client.logger.
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end # Client
|
46
|
-
end
|
1
|
+
require 'thread'
|
2
|
+
require 'logger'
|
3
|
+
require 'glottis/handlers/console_input_handler'
|
4
|
+
require 'glottis/handlers/console_output_handler'
|
5
|
+
require 'glottis/handlers/remote_input_handler'
|
6
|
+
require 'glottis/handlers/remote_output_handler'
|
7
|
+
|
8
|
+
module Glottis
|
9
|
+
# Client class, used to interact with the host specified.
|
10
|
+
class Client
|
11
|
+
def self.logger
|
12
|
+
@logger ||= Logger.new(STDOUT)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(host, port, opts = {})
|
16
|
+
@host = host
|
17
|
+
@port = port
|
18
|
+
@outgoing = Queue.new
|
19
|
+
@incoming = Queue.new
|
20
|
+
Client.logger.level = opts[:verbose] ? Logger::DEBUG : Logger::WARN
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
Client.logger.info('starting...')
|
25
|
+
Thread.abort_on_exception = true
|
26
|
+
|
27
|
+
@handlers = [
|
28
|
+
Handlers::ConsoleInputHandler.new(@outgoing),
|
29
|
+
Handlers::ConsoleOutputHandler.new(@incoming),
|
30
|
+
Handlers::RemoteInputHandler.new(@incoming, @host, @port),
|
31
|
+
Handlers::RemoteOutputHandler.new(@outgoing, @host, @port)
|
32
|
+
]
|
33
|
+
|
34
|
+
@handlers.each(&:join)
|
35
|
+
rescue Errno::ECONNREFUSED => conn_ref
|
36
|
+
Client.logger.error("failed to connect: #{conn_ref}")
|
37
|
+
rescue StandardError => ex
|
38
|
+
Client.logger.warn("shutting down: #{ex}")
|
39
|
+
ensure
|
40
|
+
@handlers.each(&:cleanup)
|
41
|
+
exit(0)
|
42
|
+
end # run
|
43
|
+
end # Client
|
44
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
module Glottis
|
2
|
-
module Exceptions
|
3
|
-
class GlottisException < StandardError
|
4
|
-
end
|
5
|
-
end
|
6
|
-
end
|
1
|
+
module Glottis
|
2
|
+
module Exceptions
|
3
|
+
class GlottisException < StandardError
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'glottis/exceptions/glottis_exception'
|
2
|
-
|
3
|
-
module Glottis
|
4
|
-
module Exceptions
|
5
|
-
class UserExitedException < GlottisException
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
1
|
+
require 'glottis/exceptions/glottis_exception'
|
2
|
+
|
3
|
+
module Glottis
|
4
|
+
module Exceptions
|
5
|
+
class UserExitedException < GlottisException
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
@@ -1,32 +1,32 @@
|
|
1
|
-
require 'glottis/exceptions/user_exited_exception'
|
2
|
-
require 'readline'
|
3
|
-
|
4
|
-
module Glottis
|
5
|
-
module Handlers
|
6
|
-
# This class holds a reference to the outgoing message queue,
|
7
|
-
# and posts messages to it from the console as they are entered.
|
8
|
-
class ConsoleInputHandler < Thread
|
9
|
-
USER_PROMPT = '> '.freeze
|
10
|
-
|
11
|
-
def initialize(outgoing)
|
12
|
-
@outgoing = outgoing
|
13
|
-
super do
|
14
|
-
loop do
|
15
|
-
user_input = Readline.readline(USER_PROMPT)
|
16
|
-
Readline::HISTORY.push(user_input)
|
17
|
-
|
18
|
-
# if user_input.nil?
|
19
|
-
# raise Glottis::Exceptions::UserExitedException.new
|
20
|
-
# end
|
21
|
-
|
22
|
-
@outgoing.push(user_input)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def cleanup
|
28
|
-
# do nothing
|
29
|
-
end
|
30
|
-
end # ConsoleInputHandler
|
31
|
-
end # Handlers
|
32
|
-
end # Glottis
|
1
|
+
require 'glottis/exceptions/user_exited_exception'
|
2
|
+
require 'readline'
|
3
|
+
|
4
|
+
module Glottis
|
5
|
+
module Handlers
|
6
|
+
# This class holds a reference to the outgoing message queue,
|
7
|
+
# and posts messages to it from the console as they are entered.
|
8
|
+
class ConsoleInputHandler < Thread
|
9
|
+
USER_PROMPT = '> '.freeze
|
10
|
+
|
11
|
+
def initialize(outgoing)
|
12
|
+
@outgoing = outgoing
|
13
|
+
super do
|
14
|
+
loop do
|
15
|
+
user_input = Readline.readline(USER_PROMPT)
|
16
|
+
Readline::HISTORY.push(user_input)
|
17
|
+
|
18
|
+
# if user_input.nil?
|
19
|
+
# raise Glottis::Exceptions::UserExitedException.new
|
20
|
+
# end
|
21
|
+
|
22
|
+
@outgoing.push(user_input)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def cleanup
|
28
|
+
# do nothing
|
29
|
+
end
|
30
|
+
end # ConsoleInputHandler
|
31
|
+
end # Handlers
|
32
|
+
end # Glottis
|
@@ -1,21 +1,21 @@
|
|
1
|
-
module Glottis
|
2
|
-
module Handlers
|
3
|
-
# This class holds a reference to the incoming message queue,
|
4
|
-
# and displays messages in the console as they are received.
|
5
|
-
class ConsoleOutputHandler < Thread
|
6
|
-
def initialize(incoming)
|
7
|
-
@incoming = incoming
|
8
|
-
super do
|
9
|
-
loop do
|
10
|
-
new_msg = @incoming.pop
|
11
|
-
puts "#{new_msg['from']}, #{new_msg['to']}, #{new_msg['msg']}"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def cleanup
|
17
|
-
puts '|'
|
18
|
-
end
|
19
|
-
end # ConsoleOutputHandler
|
20
|
-
end # Handlers
|
21
|
-
end # Glottis
|
1
|
+
module Glottis
|
2
|
+
module Handlers
|
3
|
+
# This class holds a reference to the incoming message queue,
|
4
|
+
# and displays messages in the console as they are received.
|
5
|
+
class ConsoleOutputHandler < Thread
|
6
|
+
def initialize(incoming)
|
7
|
+
@incoming = incoming
|
8
|
+
super do
|
9
|
+
loop do
|
10
|
+
new_msg = @incoming.pop
|
11
|
+
puts "#{new_msg['from']}, #{new_msg['to']}, #{new_msg['msg']}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def cleanup
|
17
|
+
puts '|'
|
18
|
+
end
|
19
|
+
end # ConsoleOutputHandler
|
20
|
+
end # Handlers
|
21
|
+
end # Glottis
|
@@ -1,53 +1,53 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'uri'
|
3
|
-
require 'net/http'
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
module Glottis
|
7
|
-
module Handlers
|
8
|
-
# This class manages a TCP connection with a valyx server.
|
9
|
-
class RemoteInputHandler < Thread
|
10
|
-
PROTOCOL = 'http'.freeze
|
11
|
-
STREAM_DELIMITER = "\0".freeze
|
12
|
-
READ_TIMEOUT = 3600 # this needs to be high
|
13
|
-
REMOTE_PATHS = {
|
14
|
-
get_message_stream: '/api/messages/stream'
|
15
|
-
}.freeze
|
16
|
-
|
17
|
-
def initialize(incoming, host, port)
|
18
|
-
@incoming = incoming
|
19
|
-
@host = host
|
20
|
-
@port = port
|
21
|
-
|
22
|
-
setup_http
|
23
|
-
|
24
|
-
super do
|
25
|
-
@http.start
|
26
|
-
read_loop
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def cleanup
|
31
|
-
@http.finish if @http.started?
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def setup_http
|
37
|
-
@http = Net::HTTP.new(@host, @port)
|
38
|
-
@http.open_timeout = 1
|
39
|
-
@http.read_timeout = READ_TIMEOUT
|
40
|
-
end
|
41
|
-
|
42
|
-
def read_loop
|
43
|
-
Client.logger.info('reading stream...')
|
44
|
-
@http.get(REMOTE_PATHS.fetch(:get_message_stream)) do |chunk|
|
45
|
-
Client.logger.debug("got chunk of length: #{chunk.length}")
|
46
|
-
chunk.split(STREAM_DELIMITER).each do |msg_data|
|
47
|
-
@incoming.push(JSON.parse(msg_data))
|
48
|
-
end # each
|
49
|
-
end # get
|
50
|
-
end # read_loop
|
51
|
-
end # RemoteInputHandler
|
52
|
-
end # Handlers
|
53
|
-
end # Glottis
|
1
|
+
require 'logger'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/http'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Glottis
|
7
|
+
module Handlers
|
8
|
+
# This class manages a TCP connection with a valyx server.
|
9
|
+
class RemoteInputHandler < Thread
|
10
|
+
PROTOCOL = 'http'.freeze
|
11
|
+
STREAM_DELIMITER = "\0".freeze
|
12
|
+
READ_TIMEOUT = 3600 # this needs to be high
|
13
|
+
REMOTE_PATHS = {
|
14
|
+
get_message_stream: '/api/messages/stream'
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
def initialize(incoming, host, port)
|
18
|
+
@incoming = incoming
|
19
|
+
@host = host
|
20
|
+
@port = port
|
21
|
+
|
22
|
+
setup_http
|
23
|
+
|
24
|
+
super do
|
25
|
+
@http.start
|
26
|
+
read_loop
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def cleanup
|
31
|
+
@http.finish if @http.started?
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def setup_http
|
37
|
+
@http = Net::HTTP.new(@host, @port)
|
38
|
+
@http.open_timeout = 1
|
39
|
+
@http.read_timeout = READ_TIMEOUT
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_loop
|
43
|
+
Client.logger.info('reading stream...')
|
44
|
+
@http.get(REMOTE_PATHS.fetch(:get_message_stream)) do |chunk|
|
45
|
+
Client.logger.debug("got chunk of length: #{chunk.length}")
|
46
|
+
chunk.split(STREAM_DELIMITER).each do |msg_data|
|
47
|
+
@incoming.push(JSON.parse(msg_data))
|
48
|
+
end # each
|
49
|
+
end # get
|
50
|
+
end # read_loop
|
51
|
+
end # RemoteInputHandler
|
52
|
+
end # Handlers
|
53
|
+
end # Glottis
|
@@ -1,107 +1,87 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'uri'
|
3
|
-
require 'net/http'
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
module Glottis
|
7
|
-
module Handlers
|
8
|
-
# This class manages a TCP connection with a valyx server.
|
9
|
-
class RemoteOutputHandler < Thread
|
10
|
-
POLL_INTERVAL = 0.1
|
11
|
-
PROTOCOL = 'http'.freeze
|
12
|
-
|
13
|
-
REMOTE_PATHS = {
|
14
|
-
get_session: '/api/session',
|
15
|
-
post_message: '/api/message'
|
16
|
-
}.freeze
|
17
|
-
|
18
|
-
def initialize(outgoing, host, port)
|
19
|
-
@outgoing = outgoing
|
20
|
-
@host = host
|
21
|
-
@port = port
|
22
|
-
|
23
|
-
setup_http
|
24
|
-
|
25
|
-
super do
|
26
|
-
@http.start
|
27
|
-
request_session
|
28
|
-
|
29
|
-
loop do
|
30
|
-
send_queued
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def cleanup
|
36
|
-
@http.finish if @http.started?
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def setup_http
|
42
|
-
@http = Net::HTTP.new(@host, @port)
|
43
|
-
# TODO: make these configurable somewhere
|
44
|
-
@http.open_timeout = 1
|
45
|
-
@http.read_timeout = 1
|
46
|
-
end
|
47
|
-
|
48
|
-
def request_session
|
49
|
-
Client.logger.info('making initial request for session...')
|
50
|
-
|
51
|
-
session_req = @http.get(REMOTE_PATHS.fetch(:get_session))
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
@sid = response['sid']
|
60
|
-
Client.logger.info("current session id: #{@sid}")
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
def send_queued
|
91
|
-
Client.logger.info("processing message with #{@outgoing.size} messages outgoing")
|
92
|
-
|
93
|
-
message_data = {
|
94
|
-
from: @sid,
|
95
|
-
to: '*',
|
96
|
-
msg: @outgoing.pop
|
97
|
-
}.to_json
|
98
|
-
|
99
|
-
post_req = @http.post(REMOTE_PATHS.fetch(:post_message), message_data)
|
100
|
-
|
101
|
-
if_not_ok(post_req) do |err|
|
102
|
-
Client.logger.warn("failed to post message: #{message_data} #{err}")
|
103
|
-
end
|
104
|
-
end # send_queued
|
105
|
-
end # RemoteOutputHandler
|
106
|
-
end # Handlers
|
107
|
-
end # Glottis
|
1
|
+
require 'logger'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/http'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
module Glottis
|
7
|
+
module Handlers
|
8
|
+
# This class manages a TCP connection with a valyx server.
|
9
|
+
class RemoteOutputHandler < Thread
|
10
|
+
POLL_INTERVAL = 0.1
|
11
|
+
PROTOCOL = 'http'.freeze
|
12
|
+
|
13
|
+
REMOTE_PATHS = {
|
14
|
+
get_session: '/api/session',
|
15
|
+
post_message: '/api/message'
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def initialize(outgoing, host, port)
|
19
|
+
@outgoing = outgoing
|
20
|
+
@host = host
|
21
|
+
@port = port
|
22
|
+
|
23
|
+
setup_http
|
24
|
+
|
25
|
+
super do
|
26
|
+
@http.start
|
27
|
+
request_session
|
28
|
+
|
29
|
+
loop do
|
30
|
+
send_queued
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def cleanup
|
36
|
+
@http.finish if @http.started?
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def setup_http
|
42
|
+
@http = Net::HTTP.new(@host, @port)
|
43
|
+
# TODO: make these configurable somewhere
|
44
|
+
@http.open_timeout = 1
|
45
|
+
@http.read_timeout = 1
|
46
|
+
end
|
47
|
+
|
48
|
+
def request_session
|
49
|
+
Client.logger.info('making initial request for session...')
|
50
|
+
|
51
|
+
session_req = @http.get(REMOTE_PATHS.fetch(:get_session))
|
52
|
+
|
53
|
+
response = JSON.parse(session_req.body)
|
54
|
+
|
55
|
+
if Integer(session_req.code) != 201
|
56
|
+
raise "failed to retrieve session: #{response}"
|
57
|
+
end
|
58
|
+
|
59
|
+
@sid = response['sid']
|
60
|
+
Client.logger.info("current session id: #{@sid}")
|
61
|
+
end
|
62
|
+
|
63
|
+
# given the result of a .get or .post, converts the response code,
|
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)
|
67
|
+
yield http_req.body if Integer(http_req.code) != ok_code
|
68
|
+
end
|
69
|
+
|
70
|
+
def send_queued
|
71
|
+
Client.logger.info("processing message with #{@outgoing.size} messages outgoing")
|
72
|
+
|
73
|
+
message_data = {
|
74
|
+
from: @sid,
|
75
|
+
to: '*',
|
76
|
+
msg: @outgoing.pop
|
77
|
+
}.to_json
|
78
|
+
|
79
|
+
post_req = @http.post(REMOTE_PATHS.fetch(:post_message), message_data)
|
80
|
+
|
81
|
+
if_not_ok(post_req) do |err|
|
82
|
+
Client.logger.warn("failed to post message: #{message_data} #{err}")
|
83
|
+
end
|
84
|
+
end # send_queued
|
85
|
+
end # RemoteOutputHandler
|
86
|
+
end # Handlers
|
87
|
+
end # Glottis
|
data/lib/glottis/version.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
end
|
1
|
+
module Glottis
|
2
|
+
VERSION = '0.1.3'.freeze
|
3
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glottis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max DeLiso
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rb-readline
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.10'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.10.3
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 0.10.3
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rake
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +72,14 @@ dependencies:
|
|
86
72
|
requirements:
|
87
73
|
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
75
|
+
version: 0.37.2
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
80
|
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
82
|
+
version: 0.37.2
|
97
83
|
description:
|
98
84
|
email:
|
99
85
|
- maxdeliso@gmail.com
|