tcp-server 1.1.3-java → 1.1.5-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 +2 -2
- data/lib/server/argument_parser.rb +6 -5
- data/lib/server/config.rb +28 -10
- data/lib/server/instance_methods.rb +39 -8
- data/lib/server/listenable.rb +2 -2
- data/lib/server/server.rb +5 -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: 2174a5497f0b0358242e9592b698912fd8f06943deaa8291cd24045478eac44e
|
4
|
+
data.tar.gz: c21770eddc3798b518c2685c5e93adf56d560b8380264b4673914b59a24cc26a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8811e5ba0e0d1556f0b31d13b04fbaf40465031c0b568a390432330eefdc991346eb5507ee76ca72254629de2a5cbfd928870d6e20a942daf6accb9f0bc36f83
|
7
|
+
data.tar.gz: 178e6ef353f59025743761d138fc51a7c0e1c4f0b517f3b4f1ab7a50d55e2652d3094a2b817ff48497ee1522197efed04b4ea380761a29f2e53f080a7312bab8
|
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
|
|
@@ -208,7 +208,7 @@ curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/
|
|
208
208
|
```
|
209
209
|
|
210
210
|
[license]: https://gitlab.com/nelsnelson/tcp-server-jruby/blob/master/LICENSE
|
211
|
-
[
|
211
|
+
[mise]: https://mise.jdx.dev/
|
212
212
|
[colima]: https://github.com/abiosoft/colima
|
213
213
|
[Netty project]: https://github.com/netty/netty
|
214
214
|
[Java JDK]: https://www.java.com/en/download/
|
@@ -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,25 +10,43 @@
|
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
|
+
require 'java'
|
13
14
|
require 'netty'
|
14
15
|
|
15
16
|
require 'logger'
|
16
17
|
|
17
18
|
# The Server module
|
18
19
|
module Server
|
20
|
+
DEFAULT_LOG_LEVEL = Logger::INFO
|
21
|
+
DEFAULT_HOST = '0.0.0.0'.freeze
|
22
|
+
DEFAULT_PORT = 8080
|
23
|
+
DEFAULT_SSL_ENABLED = false
|
24
|
+
DEFAULT_IDLE_READING_SECONDS = 5 * 60 # seconds
|
25
|
+
DEFAULT_IDLE_WRITING_SECONDS = 30 # seconds
|
26
|
+
DEFAULT_KEEP_ALIVE = false
|
27
|
+
DEFAULT_MAX_QUEUED_INCOMING_CONNECTIONS = 100
|
28
|
+
DEFAULT_MAX_FRAME_LENGTH = 8192
|
29
|
+
DEFAULT_DELIMITER = Java::io.netty.handler.codec.Delimiters.lineDelimiter
|
30
|
+
DEFAULT_LOG_REQUESTS = false
|
31
|
+
DEFAULT_QUIT_COMMANDS = %i[
|
32
|
+
bye cease desist exit leave quit stop terminate
|
33
|
+
].freeze
|
34
|
+
|
19
35
|
# rubocop: disable Metrics/MethodLength
|
20
36
|
def server_config
|
21
37
|
@server_config ||= {
|
22
|
-
host:
|
23
|
-
port:
|
24
|
-
ssl:
|
25
|
-
idle_reading:
|
26
|
-
idle_writing:
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
38
|
+
host: DEFAULT_HOST,
|
39
|
+
port: DEFAULT_PORT,
|
40
|
+
ssl: DEFAULT_SSL_ENABLED,
|
41
|
+
idle_reading: DEFAULT_IDLE_READING_SECONDS,
|
42
|
+
idle_writing: DEFAULT_IDLE_WRITING_SECONDS,
|
43
|
+
max_queued_incoming_connections: DEFAULT_MAX_QUEUED_INCOMING_CONNECTIONS,
|
44
|
+
log_requests: DEFAULT_LOG_REQUESTS,
|
45
|
+
log_level: DEFAULT_LOG_LEVEL,
|
46
|
+
quit_commands: DEFAULT_QUIT_COMMANDS,
|
47
|
+
max_frame_length: DEFAULT_MAX_FRAME_LENGTH,
|
48
|
+
keep_alive: DEFAULT_KEEP_ALIVE,
|
49
|
+
delimiter: DEFAULT_DELIMITER
|
32
50
|
}.freeze
|
33
51
|
end
|
34
52
|
module_function :server_config
|
@@ -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/listenable.rb
CHANGED
@@ -22,8 +22,6 @@ module Server
|
|
22
22
|
|
23
23
|
def add_listener(*listener)
|
24
24
|
listeners.addAll(listener)
|
25
|
-
ensure
|
26
|
-
log.trace "Listeners: #{listeners}"
|
27
25
|
end
|
28
26
|
|
29
27
|
def remove_listener(*listener)
|
@@ -33,6 +31,8 @@ module Server
|
|
33
31
|
def replace_listeners(*listener)
|
34
32
|
listeners.clear
|
35
33
|
add_listener(*listener)
|
34
|
+
ensure
|
35
|
+
log.trace "Listeners after replacement: #{listeners}"
|
36
36
|
end
|
37
37
|
|
38
38
|
def notify(event, *args)
|
data/lib/server/server.rb
CHANGED
@@ -28,13 +28,16 @@ module Server
|
|
28
28
|
raise ArgumentError, 'Parameter may not be nil: options' if options.nil?
|
29
29
|
@options = ::Server.server_config.merge(options)
|
30
30
|
configure_handlers(*handlers, &block)
|
31
|
+
ensure
|
32
|
+
log.trace "Listeners after initialization of #{self}: #{channel_initializer.default_handler.listeners}"
|
31
33
|
end
|
32
34
|
|
33
35
|
# rubocop: disable Metrics/AbcSize
|
34
36
|
def message_received(ctx, msg)
|
37
|
+
return if msg.nil?
|
38
|
+
msg.chomp! if msg.respond_to?(:chomp!)
|
39
|
+
return if msg.respond_to?(:empty?) && msg.empty?
|
35
40
|
log.trace "##{__method__} channel: #{ctx.channel}, message: #{msg.inspect}"
|
36
|
-
msg&.chomp!
|
37
|
-
return if msg.nil? || msg.empty?
|
38
41
|
return ctx.close() if @options[:quit_commands].include?(msg.downcase.to_sym)
|
39
42
|
response = msg.upcase
|
40
43
|
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.5
|
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-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|