tcp-server 1.1.2-java → 1.1.4-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -16
- data/lib/logging.rb +1 -1
- data/lib/server/argument_parser.rb +6 -5
- data/lib/server/config.rb +4 -1
- data/lib/server/instance_methods.rb +39 -8
- data/lib/server/server.rb +6 -2
- data/lib/server/shutdown_hook.rb +1 -1
- data/lib/server/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33f9e64d109b0bdcc53bfe8cda1c4d113106cc7a9d1f6e423cfb4fd6a9fcff52
|
4
|
+
data.tar.gz: 9663b9e88b11d643b51292a705fbbb0ea8509fc288b175404a76b021c8edc945
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dadc64a13e62cf4981b28d1d1b1d8c90748c30ff9164a646ac5cea2a294efca2916389e608b8510733333a1f66add302e43d3a537eab7f665eba2acac45ccf96
|
7
|
+
data.tar.gz: 72ff75a438437b1005f8d6bc8d8d3b00e3dcc96b3f4d2f17c86db1800e0e22b4ee46a9ac5621e36998741d181c81b01f6b4e1f12beea52c7237da546061bcefa
|
data/README.md
CHANGED
@@ -26,7 +26,7 @@ docker-compose down
|
|
26
26
|
Building the image or running the container:
|
27
27
|
|
28
28
|
```sh
|
29
|
-
docker build --
|
29
|
+
docker build --tag tcp-server-jruby .
|
30
30
|
docker run --detach --publish 4000:4000 --name tcp-server-jruby tcp-server-jruby
|
31
31
|
```
|
32
32
|
|
@@ -43,35 +43,32 @@ The [mise] CLI tool used to manage multiple runtime versions.
|
|
43
43
|
See: https://mise.jdx.dev/getting-started.html
|
44
44
|
|
45
45
|
```sh
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
curl https://mise.jdx.dev/install.sh | sh
|
47
|
+
~/.local/bin/mise --version
|
48
|
+
mise 2024.x.x
|
49
49
|
```
|
50
50
|
|
51
|
-
|
52
|
-
### Install required runtime software
|
53
|
-
|
54
|
-
Download and install the latest version of the [Java JDK].
|
51
|
+
Enable mise activation in future zsh sessions.
|
55
52
|
|
56
53
|
```sh
|
57
|
-
|
58
|
-
asdf install java openjdk-17.0.2
|
54
|
+
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
|
59
55
|
```
|
60
56
|
|
61
57
|
|
62
|
-
|
58
|
+
## Install required runtime software
|
59
|
+
|
60
|
+
Use mise to install the runtime software defined as requirements
|
61
|
+
in the .tool-versions file.
|
63
62
|
|
64
63
|
```sh
|
65
|
-
|
66
|
-
asdf plugin update --all
|
67
|
-
asdf list all ruby
|
68
|
-
asdf install ruby jruby-9.3.4.0
|
64
|
+
mise install
|
69
65
|
```
|
70
66
|
|
71
67
|
|
72
68
|
Install the project dependencies.
|
73
69
|
|
74
70
|
```sh
|
71
|
+
gem install bundler
|
75
72
|
bundle install
|
76
73
|
```
|
77
74
|
|
@@ -211,7 +208,7 @@ curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/
|
|
211
208
|
```
|
212
209
|
|
213
210
|
[license]: https://gitlab.com/nelsnelson/tcp-server-jruby/blob/master/LICENSE
|
214
|
-
[
|
211
|
+
[mise]: https://mise.jdx.dev/
|
215
212
|
[colima]: https://github.com/abiosoft/colima
|
216
213
|
[Netty project]: https://github.com/netty/netty
|
217
214
|
[Java JDK]: https://www.java.com/en/download/
|
data/lib/logging.rb
CHANGED
@@ -156,7 +156,7 @@ module Logging
|
|
156
156
|
java_import Java::org.apache.logging.log4j.LogManager
|
157
157
|
end
|
158
158
|
|
159
|
-
FORWARD_SLASH_PATTERN = %r{/}
|
159
|
+
FORWARD_SLASH_PATTERN = %r{/} unless defined?(FORWARD_SLASH_PATTERN)
|
160
160
|
|
161
161
|
def init_logger(level = :info, logger_name = nil)
|
162
162
|
return init_java_logger(level, logger_name, caller[2]) if defined?(Java)
|
@@ -33,11 +33,11 @@ module Server
|
|
33
33
|
@parser.separator 'Options:'
|
34
34
|
end
|
35
35
|
|
36
|
-
def validated_port(
|
37
|
-
raise OptionParser::InvalidArgument, "Invalid port: #{
|
38
|
-
integer_pattern.match?(
|
36
|
+
def validated_port(value, integer_pattern = /^\d+$/)
|
37
|
+
raise OptionParser::InvalidArgument, "Invalid port: #{value}" unless \
|
38
|
+
integer_pattern.match?(value.to_s) && value.positive? && value < 65_536
|
39
39
|
|
40
|
-
|
40
|
+
value
|
41
41
|
end
|
42
42
|
|
43
43
|
def port
|
@@ -97,7 +97,8 @@ module Server
|
|
97
97
|
def parse_arguments(arguments_parser = ::Server::ArgumentsParser.new)
|
98
98
|
arguments_parser.parser.parse!(ARGV)
|
99
99
|
arguments_parser.options
|
100
|
-
rescue OptionParser::
|
100
|
+
rescue OptionParser::InvalidArgument, OptionParser::InvalidOption,
|
101
|
+
OptionParser::AmbiguousOption => e
|
101
102
|
abort e.message
|
102
103
|
end
|
103
104
|
end
|
data/lib/server/config.rb
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
|
+
require 'java'
|
13
14
|
require 'netty'
|
14
15
|
|
15
16
|
require 'logger'
|
@@ -20,14 +21,16 @@ module Server
|
|
20
21
|
def server_config
|
21
22
|
@server_config ||= {
|
22
23
|
host: '0.0.0.0',
|
23
|
-
port:
|
24
|
+
port: Server::DEFAULT_PORT,
|
24
25
|
ssl: false,
|
25
26
|
idle_reading: 5 * 60, # seconds
|
26
27
|
idle_writing: 30, # seconds
|
28
|
+
max_queued_incoming_connections: Server::DEFAULT_MAX_QUEUED_INCOMING_CONNECTIONS,
|
27
29
|
log_requests: false,
|
28
30
|
log_level: Logger::INFO,
|
29
31
|
quit_commands: %i[bye cease desist exit leave quit stop terminate],
|
30
32
|
max_frame_length: 8192,
|
33
|
+
keep_alive: Server::DEFAULT_KEEP_ALIVE,
|
31
34
|
delimiter: Java::io.netty.handler.codec.Delimiters.lineDelimiter
|
32
35
|
}.freeze
|
33
36
|
end
|
@@ -28,19 +28,26 @@ module Server
|
|
28
28
|
|
29
29
|
# The InstanceMethods module
|
30
30
|
module InstanceMethods
|
31
|
+
# rubocop: disable Metrics/AbcSize
|
32
|
+
def bootstrap
|
33
|
+
@bootstrap = ServerBootstrap.new
|
34
|
+
@bootstrap.group(boss_group, worker_group)
|
35
|
+
@bootstrap.channel(channel_type)
|
36
|
+
@bootstrap.option(ChannelOption::SO_BACKLOG, max_queued_incoming_connections)
|
37
|
+
@bootstrap.childOption(ChannelOption::SO_KEEPALIVE, keep_alive) if keep_alive
|
38
|
+
@bootstrap.handler(logging_handler) if options.fetch(:log_requests, false)
|
39
|
+
@bootstrap.childHandler(channel_initializer)
|
40
|
+
end
|
41
|
+
# rubocop: enable Metrics/AbcSize
|
42
|
+
|
31
43
|
def configure_handlers(*handlers, &block)
|
32
44
|
add_listener(self)
|
33
45
|
channel_initializer << block if block_given?
|
34
46
|
add_listener(*handlers)
|
35
47
|
end
|
36
48
|
|
37
|
-
def
|
38
|
-
@
|
39
|
-
@bootstrap.group(boss_group, worker_group)
|
40
|
-
@bootstrap.channel(Server::CHANNEL_TYPE)
|
41
|
-
@bootstrap.option(ChannelOption::SO_BACKLOG, 100.to_java(java.lang.Integer))
|
42
|
-
@bootstrap.handler(logging_handler) if options[:log_requests]
|
43
|
-
@bootstrap.childHandler(channel_initializer)
|
49
|
+
def channel_type
|
50
|
+
@channel_type ||= Server::CHANNEL_TYPE
|
44
51
|
end
|
45
52
|
|
46
53
|
def channel_initializer
|
@@ -65,7 +72,7 @@ module Server
|
|
65
72
|
|
66
73
|
# rubocop: disable Metrics/AbcSize
|
67
74
|
# rubocop: disable Metrics/MethodLength
|
68
|
-
def run(port =
|
75
|
+
def run(port = self.port)
|
69
76
|
channel = bootstrap.bind(port).sync().channel()
|
70
77
|
channel_group.add(channel)
|
71
78
|
::Server::ShutdownHook.new(self)
|
@@ -83,6 +90,14 @@ module Server
|
|
83
90
|
# rubocop: enable Metrics/AbcSize
|
84
91
|
# rubocop: enable Metrics/MethodLength
|
85
92
|
|
93
|
+
def port
|
94
|
+
@port ||= begin
|
95
|
+
value = @options[:port]
|
96
|
+
value = DEFAULT_PORT if value.nil?
|
97
|
+
value.to_i
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
86
101
|
def shutdown
|
87
102
|
channel_group.disconnect().awaitUninterruptibly()
|
88
103
|
channel_group.close().awaitUninterruptibly()
|
@@ -104,6 +119,22 @@ module Server
|
|
104
119
|
def replace_listeners(*listener)
|
105
120
|
channel_initializer.replace_listeners(*listener)
|
106
121
|
end
|
122
|
+
|
123
|
+
def keep_alive
|
124
|
+
@keep_alive ||= begin
|
125
|
+
value = @options[:keep_alive]
|
126
|
+
value = DEFAULT_KEEP_ALIVE if value.nil?
|
127
|
+
value
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def max_queued_incoming_connections
|
132
|
+
@max_queued_incoming_connections ||= begin
|
133
|
+
value = @options[:max_queued_incoming_connections]
|
134
|
+
value = DEFAULT_MAX_QUEUED_INCOMING_CONNECTIONS if value.nil?
|
135
|
+
value.to_java(java.lang.Integer)
|
136
|
+
end
|
137
|
+
end
|
107
138
|
end
|
108
139
|
# module ServerInstanceMethods
|
109
140
|
end
|
data/lib/server/server.rb
CHANGED
@@ -21,6 +21,9 @@ module Server
|
|
21
21
|
# The Server class sets up the netty server.
|
22
22
|
class Server
|
23
23
|
CHANNEL_TYPE = Java::io.netty.channel.socket.nio.NioServerSocketChannel.java_class
|
24
|
+
DEFAULT_MAX_QUEUED_INCOMING_CONNECTIONS = 100
|
25
|
+
DEFAULT_KEEP_ALIVE = false
|
26
|
+
DEFAULT_PORT = 8080
|
24
27
|
include ::Server::InstanceMethods
|
25
28
|
attr_reader :options
|
26
29
|
|
@@ -32,9 +35,10 @@ module Server
|
|
32
35
|
|
33
36
|
# rubocop: disable Metrics/AbcSize
|
34
37
|
def message_received(ctx, msg)
|
38
|
+
return if msg.nil?
|
39
|
+
msg.chomp! if msg.respond_to?(:chomp!)
|
40
|
+
return if msg.respond_to?(:empty?) && msg.empty?
|
35
41
|
log.trace "##{__method__} channel: #{ctx.channel}, message: #{msg.inspect}"
|
36
|
-
msg&.chomp!
|
37
|
-
return if msg.nil? || msg.empty?
|
38
42
|
return ctx.close() if @options[:quit_commands].include?(msg.downcase.to_sym)
|
39
43
|
response = msg.upcase
|
40
44
|
log.debug "Sending response: #{response.inspect}"
|
data/lib/server/shutdown_hook.rb
CHANGED
data/lib/server/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcp-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Nels Nelson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|