tcp-server 1.0.12-java → 1.1.2-java
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/README.md +16 -10
- data/exe/tcp_server +1 -1
- data/lib/client.rb +5 -13
- data/lib/demo_listener.rb +1 -2
- data/lib/{log.rb → logging.rb} +92 -83
- data/lib/server/argument_parser.rb +2 -2
- data/lib/server/channel_initializer.rb +2 -2
- data/lib/server/config.rb +1 -1
- data/lib/server/instance_methods.rb +3 -2
- data/lib/server/listenable.rb +1 -1
- data/lib/server/message_handler.rb +1 -1
- data/lib/server/modular_handler.rb +1 -1
- data/lib/server/server.rb +5 -4
- data/lib/server/shutdown_hook.rb +1 -1
- data/lib/server/version.rb +2 -2
- data/lib/server.rb +5 -14
- data/lib/tcp-server.rb +1 -1
- data/lib/tcp_server.rb +1 -1
- metadata +10 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07e7184d3ca0f9e6db19db9d7de0561690ca2afe3aa17d66c29e4883591938f5
|
4
|
+
data.tar.gz: b70a0d40bddcb3f5fbda8079873612db7f033ce5d9c62c28ab9fd1a1eb9b59de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43b0a8ecb712fa514d73378a08a97dc4320ad7ce7de1420550a2cf4574b8c62ba29e66c1a7e14b4a89d5ff472ca2ef73f434629fc38c2430270b7d58063af25f
|
7
|
+
data.tar.gz: b09fd364b5304ce1ec7dc1c9cf6f3822ec059eeac9c6d5ca263dd657d9c801c378836ab9a71716f645b3eb0ad4d1d55a905e9357ef50b4be357ad5d71ff82be4
|
data/README.md
CHANGED
@@ -12,9 +12,9 @@ It is based on the [Netty project]. Netty is written in java, but I wanted to w
|
|
12
12
|
Follow these instructions to get a tcp server echo program running.
|
13
13
|
|
14
14
|
|
15
|
-
###
|
15
|
+
### Container
|
16
16
|
|
17
|
-
You may run the websocket server in a container.
|
17
|
+
You may run the websocket server in a container. Using `[colima]` for a container runtime is recommended.
|
18
18
|
|
19
19
|
```sh
|
20
20
|
colima start
|
@@ -26,7 +26,7 @@ docker-compose down
|
|
26
26
|
Building the image or running the container:
|
27
27
|
|
28
28
|
```sh
|
29
|
-
docker build --tag tcp-server-jruby .
|
29
|
+
docker build --squash --tag tcp-server-jruby .
|
30
30
|
docker run --detach --publish 4000:4000 --name tcp-server-jruby tcp-server-jruby
|
31
31
|
```
|
32
32
|
|
@@ -35,9 +35,12 @@ docker run --detach --publish 4000:4000 --name tcp-server-jruby tcp-server-jruby
|
|
35
35
|
|
36
36
|
If one insists, one may run everything directly with the required dependencies installed.
|
37
37
|
|
38
|
-
### Install asdf
|
39
38
|
|
40
|
-
|
39
|
+
## Install mise-en-place
|
40
|
+
|
41
|
+
The [mise] CLI tool used to manage multiple runtime versions.
|
42
|
+
|
43
|
+
See: https://mise.jdx.dev/getting-started.html
|
41
44
|
|
42
45
|
```sh
|
43
46
|
git clone https://github.com/asdf-vm/asdf.git "${HOME}/.asdf" --branch release-v0.10.0
|
@@ -45,6 +48,7 @@ pushd "${HOME}/.asdf"; git fetch origin; popd
|
|
45
48
|
source "${HOME}/.asdf/asdf.sh"; source "${HOME}/.asdf/completions/asdf.bash"
|
46
49
|
```
|
47
50
|
|
51
|
+
|
48
52
|
### Install required runtime software
|
49
53
|
|
50
54
|
Download and install the latest version of the [Java JDK].
|
@@ -123,8 +127,8 @@ bundle exec rake clean clobber
|
|
123
127
|
Here is a bird's-eye view of the project layout.
|
124
128
|
|
125
129
|
```sh
|
126
|
-
# date && tree -I "logs|vendor|tmp"
|
127
|
-
|
130
|
+
# date && tree -A -I "logs|vendor|tmp|Gemfile.lock"
|
131
|
+
Sat Jul 23 22:12:37 CDT 2022
|
128
132
|
.
|
129
133
|
├── Dockerfile
|
130
134
|
├── Gemfile
|
@@ -138,7 +142,7 @@ Wed Jul 20 13:18:23 CDT 2022
|
|
138
142
|
├── lib
|
139
143
|
│ ├── client.rb
|
140
144
|
│ ├── demo_listener.rb
|
141
|
-
│ ├──
|
145
|
+
│ ├── logging.rb
|
142
146
|
│ ├── server
|
143
147
|
│ │ ├── argument_parser.rb
|
144
148
|
│ │ ├── channel_initializer.rb
|
@@ -158,11 +162,12 @@ Wed Jul 20 13:18:23 CDT 2022
|
|
158
162
|
│ ├── test_spec.rb
|
159
163
|
│ └── verify
|
160
164
|
│ └── verify_spec.rb
|
165
|
+
├── tcp-server-1.0.8-java.gem
|
161
166
|
├── tcp-server-jruby.gemspec
|
162
167
|
├── tcp_server.png
|
163
168
|
└── tcp_server.rb
|
164
169
|
|
165
|
-
5 directories,
|
170
|
+
5 directories, 31 files
|
166
171
|
```
|
167
172
|
|
168
173
|
|
@@ -206,7 +211,8 @@ curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/
|
|
206
211
|
```
|
207
212
|
|
208
213
|
[license]: https://gitlab.com/nelsnelson/tcp-server-jruby/blob/master/LICENSE
|
209
|
-
[asdf]: https://
|
214
|
+
[asdf]: https://mise.jdx.dev/
|
215
|
+
[colima]: https://github.com/abiosoft/colima
|
210
216
|
[Netty project]: https://github.com/netty/netty
|
211
217
|
[Java JDK]: https://www.java.com/en/download/
|
212
218
|
[JRuby]: https://jruby.org/download
|
data/exe/tcp_server
CHANGED
data/lib/client.rb
CHANGED
@@ -8,22 +8,16 @@
|
|
8
8
|
|
9
9
|
# =begin
|
10
10
|
#
|
11
|
-
# Copyright Nels Nelson 2016-
|
11
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
12
12
|
#
|
13
13
|
# =end
|
14
14
|
|
15
15
|
require 'java'
|
16
|
-
require 'netty'
|
17
|
-
|
18
|
-
require 'logger'
|
19
16
|
require 'optparse'
|
20
17
|
|
21
|
-
require '
|
18
|
+
require 'netty'
|
22
19
|
|
23
|
-
|
24
|
-
module Client
|
25
|
-
VERSION = '1.0.1'.freeze unless defined?(VERSION)
|
26
|
-
end
|
20
|
+
require_relative 'logging'
|
27
21
|
|
28
22
|
# The Client module
|
29
23
|
module Client
|
@@ -521,7 +515,7 @@ module Client
|
|
521
515
|
|
522
516
|
def version
|
523
517
|
@parser.on_tail('--version', 'Show version') do
|
524
|
-
puts "#{$PROGRAM_NAME} version #{
|
518
|
+
puts "#{File.basename($PROGRAM_NAME)} version #{::Server::VERSION}"
|
525
519
|
exit
|
526
520
|
end
|
527
521
|
end
|
@@ -580,15 +574,13 @@ end
|
|
580
574
|
|
581
575
|
# The Client module
|
582
576
|
module Client
|
583
|
-
InterruptTemplate = "\r%<class>s".freeze
|
584
|
-
|
585
577
|
# rubocop: disable Metrics/AbcSize
|
586
578
|
# rubocop: disable Metrics/MethodLength
|
587
579
|
def main(args = parse_arguments)
|
588
580
|
Logging.log_level = args[:log_level]
|
589
581
|
::TCP::Client.new(args, ::Client::Console.new, ::Client::Monitor.new)
|
590
582
|
rescue Interrupt => e
|
591
|
-
warn format(
|
583
|
+
warn format("\r%<class>s", class: e.class)
|
592
584
|
exit
|
593
585
|
rescue RuntimeError => e
|
594
586
|
::Client.log.fatal e.message
|
data/lib/demo_listener.rb
CHANGED
data/lib/{log.rb → logging.rb}
RENAMED
@@ -1,18 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# frozen_string_literal: false
|
3
3
|
|
4
|
+
# -*- mode: ruby -*-
|
5
|
+
# vi: set ft=ruby :
|
6
|
+
|
4
7
|
# =begin
|
5
8
|
|
6
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
7
10
|
|
8
11
|
# =end
|
9
12
|
|
10
13
|
require 'java'
|
14
|
+
require 'fileutils'
|
11
15
|
require 'logger'
|
12
16
|
|
13
|
-
require 'log4j-2'
|
14
|
-
|
15
|
-
require 'fileutils'
|
17
|
+
require 'apache-log4j-2'
|
16
18
|
|
17
19
|
# The Logging module
|
18
20
|
module Logging
|
@@ -22,16 +24,22 @@ module Logging
|
|
22
24
|
lib_dir_path = File.expand_path(__dir__)
|
23
25
|
project_dir_path = File.expand_path(File.dirname(lib_dir_path))
|
24
26
|
logs_dir_path = File.expand_path(File.join(project_dir_path, 'logs'))
|
25
|
-
|
27
|
+
FileUtils.mkdir_p(logs_dir_path)
|
28
|
+
log_file_path = File.expand_path(File.join(logs_dir_path, 'server.log'))
|
29
|
+
FileUtils.touch(log_file_path)
|
26
30
|
{
|
27
|
-
level:
|
28
|
-
name: '
|
31
|
+
level: Logger::INFO,
|
32
|
+
name: 'websocket',
|
29
33
|
lib_dir_path: lib_dir_path,
|
30
34
|
project_dir_path: project_dir_path,
|
31
35
|
logs_dir_path: logs_dir_path,
|
32
|
-
|
33
|
-
rolling_log_file_name_template:
|
34
|
-
|
36
|
+
log_file_path: log_file_path,
|
37
|
+
rolling_log_file_name_template: File.expand_path(
|
38
|
+
File.join(logs_dir_path, 'server-%d{yyyy-MM-dd}.log.gz')),
|
39
|
+
logging_pattern_template: {
|
40
|
+
java: '%d{ABSOLUTE} %-5p [%c{1}] %m%n',
|
41
|
+
ruby: "%<timestamp>s %-5<severity>s [%<progname>s] %<msg>s\n"
|
42
|
+
},
|
35
43
|
schedule: '0 0 0 * * ?',
|
36
44
|
size: '100M'
|
37
45
|
}
|
@@ -41,69 +49,52 @@ module Logging
|
|
41
49
|
# rubocop: enable Metrics/MethodLength
|
42
50
|
end
|
43
51
|
|
44
|
-
# The
|
45
|
-
module
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
module_function :init
|
51
|
-
|
52
|
-
def init_log_file
|
53
|
-
FileUtils.mkdir_p(Logging.config[:logs_dir_path])
|
54
|
-
return if File.file?(Logging.config[:server_log_file])
|
55
|
-
|
56
|
-
File.write(Logging.config[:server_log_file], '')
|
52
|
+
# The Logging module
|
53
|
+
module Logging
|
54
|
+
if defined?(Java)
|
55
|
+
java_import Java::org.apache.logging.log4j.core.appender::ConsoleAppender
|
56
|
+
java_import Java::org.apache.logging.log4j.core.config::Configurator
|
57
|
+
java_import Java::org.apache.logging.log4j.core.config.builder.api::ConfigurationBuilderFactory
|
57
58
|
end
|
58
|
-
module_function :init_log_file
|
59
59
|
|
60
60
|
# rubocop: disable Metrics/AbcSize
|
61
61
|
# rubocop: disable Metrics/MethodLength
|
62
62
|
def init_log4j(log_level = org.apache.logging.log4j.Level::INFO)
|
63
|
-
server_log_file = Logging.config[:server_log_file]
|
64
|
-
logs_dir_path = Logging.config[:logs_dir_path]
|
65
|
-
rolling_log_file_name_template = Logging.config[:rolling_log_file_name_template]
|
66
|
-
rolling_log_file_path = File.join(logs_dir_path, rolling_log_file_name_template)
|
67
|
-
|
68
63
|
java.lang::System.setProperty('log4j.shutdownHookEnabled', java.lang::Boolean.toString(false))
|
69
|
-
|
70
|
-
config = factory.newConfigurationBuilder()
|
64
|
+
config = ConfigurationBuilderFactory.newConfigurationBuilder()
|
71
65
|
|
72
|
-
if log_level.is_a?
|
73
|
-
log_level = org.apache.logging.log4j.Level.to_level(
|
74
|
-
log_level.to_s.upcase
|
75
|
-
)
|
76
|
-
end
|
66
|
+
log_level = org.apache.logging.log4j::Level.to_level(log_level.to_s.upcase) if log_level.is_a? Symbol
|
77
67
|
config.setStatusLevel(log_level)
|
78
|
-
config.setConfigurationName(
|
68
|
+
config.setConfigurationName('websocket')
|
79
69
|
|
80
|
-
#
|
81
|
-
target =
|
70
|
+
# create a console appender
|
71
|
+
target = ConsoleAppender::Target::SYSTEM_OUT
|
72
|
+
pattern = Logging.config[:logging_pattern_template][:java]
|
82
73
|
layout = config.newLayout('PatternLayout')
|
83
|
-
layout = layout.addAttribute('pattern',
|
74
|
+
layout = layout.addAttribute('pattern', pattern)
|
84
75
|
appender = config.newAppender('stdout', 'CONSOLE')
|
85
76
|
appender = appender.addAttribute('target', target)
|
86
77
|
appender = appender.add(layout)
|
87
78
|
config.add(appender)
|
88
79
|
|
89
|
-
#
|
80
|
+
# create a root logger
|
90
81
|
root_logger = config.newRootLogger(log_level)
|
91
82
|
root_logger = root_logger.add(config.newAppenderRef('stdout'))
|
92
83
|
|
93
|
-
#
|
84
|
+
# create a rolling file appender
|
94
85
|
cron = config.newComponent('CronTriggeringPolicy')
|
95
|
-
cron = cron.addAttribute('schedule',
|
86
|
+
cron = cron.addAttribute('schedule', '0 0 0 * * ?')
|
96
87
|
|
97
88
|
size = config.newComponent('SizeBasedTriggeringPolicy')
|
98
|
-
size = size.addAttribute('size',
|
89
|
+
size = size.addAttribute('size', '100M')
|
99
90
|
|
100
91
|
policies = config.newComponent('Policies')
|
101
92
|
policies = policies.addComponent(cron)
|
102
93
|
policies = policies.addComponent(size)
|
103
94
|
|
104
95
|
appender = config.newAppender('rolling_file', 'RollingFile')
|
105
|
-
appender = appender.addAttribute('fileName',
|
106
|
-
appender = appender.addAttribute('filePattern',
|
96
|
+
appender = appender.addAttribute('fileName', Logging.config[:log_file_path])
|
97
|
+
appender = appender.addAttribute('filePattern', Logging.config[:rolling_log_file_name_template])
|
107
98
|
appender = appender.add(layout)
|
108
99
|
appender = appender.addComponent(policies)
|
109
100
|
config.add(appender)
|
@@ -113,28 +104,20 @@ module LogInitialization
|
|
113
104
|
config.add(root_logger)
|
114
105
|
|
115
106
|
logging_configuration = config.build()
|
116
|
-
ctx =
|
107
|
+
ctx = Configurator.initialize(logging_configuration)
|
117
108
|
ctx.updateLoggers()
|
118
109
|
end
|
110
|
+
module_function :init_log4j
|
119
111
|
# rubocop: enable Metrics/AbcSize
|
120
112
|
# rubocop: enable Metrics/MethodLength
|
121
113
|
# def init_log4j
|
122
|
-
module_function :init_log4j
|
123
|
-
end
|
124
|
-
# module LogInitialization
|
125
|
-
|
126
|
-
::LogInitialization.init
|
127
114
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
alias log4j_error error
|
132
|
-
def error(error_or_message, error = nil)
|
133
|
-
return extract_backtrace(error_or_message) if error.nil?
|
134
|
-
log4j_error(generate_message(error_or_message, error))
|
135
|
-
extract_backtrace(error)
|
136
|
-
end
|
115
|
+
init_log4j if defined?(Java)
|
116
|
+
end
|
117
|
+
# module Logging
|
137
118
|
|
119
|
+
# Namespace for methods to help with implicit backtrace printing
|
120
|
+
module LoggerHelpers
|
138
121
|
def generate_message(error_or_message, error)
|
139
122
|
error_message = "#{error_or_message}: #{error.class.name}"
|
140
123
|
error_message << ": #{error.message}" if error.respond_to?(:message)
|
@@ -142,40 +125,67 @@ class org.apache.logging.log4j.core::Logger
|
|
142
125
|
end
|
143
126
|
|
144
127
|
def extract_backtrace(error, default_result = nil)
|
145
|
-
log4j_error(error)
|
146
128
|
if error.respond_to?(:backtrace)
|
147
|
-
error.backtrace.each { |trace|
|
129
|
+
error.backtrace.each { |trace| original_error(trace) unless trace.nil? }
|
148
130
|
elsif error.respond_to?(:getStackTrace)
|
149
|
-
error.getStackTrace().each { |trace|
|
131
|
+
error.getStackTrace().each { |trace| original_error(trace) unless trace.nil? }
|
150
132
|
else
|
151
133
|
default_result
|
152
134
|
end
|
153
135
|
end
|
154
136
|
end
|
155
|
-
|
137
|
+
|
138
|
+
# Monkey-patch the built-in Ruby Logger class to support
|
139
|
+
# implicit backtrace printing
|
140
|
+
# TODO: Figure out if this is actually useful.
|
141
|
+
class Logger
|
142
|
+
include LoggerHelpers
|
143
|
+
|
144
|
+
alias original_error error
|
145
|
+
def error(error_or_message, error = nil)
|
146
|
+
return extract_backtrace(error_or_message) if error.nil?
|
147
|
+
original_error(generate_message(error_or_message, error))
|
148
|
+
extract_backtrace(original_error(error))
|
149
|
+
end
|
150
|
+
end
|
156
151
|
|
157
152
|
# The Logging module
|
158
153
|
module Logging
|
159
|
-
|
154
|
+
if defined?(Java)
|
155
|
+
java_import Java::org.apache.logging.log4j.Level
|
156
|
+
java_import Java::org.apache.logging.log4j.LogManager
|
157
|
+
end
|
158
|
+
|
159
|
+
FORWARD_SLASH_PATTERN = %r{/}
|
160
|
+
|
161
|
+
def init_logger(level = :info, logger_name = nil)
|
160
162
|
return init_java_logger(level, logger_name, caller[2]) if defined?(Java)
|
161
|
-
init_ruby_logger(level)
|
163
|
+
init_ruby_logger(level, logger_name, caller[2])
|
162
164
|
end
|
163
165
|
|
164
|
-
def
|
165
|
-
|
166
|
-
|
167
|
-
|
166
|
+
def ruby_log_formatter(severity_level, datetime, program_name, message)
|
167
|
+
format(
|
168
|
+
Logging.config[:logging_pattern_template][:ruby],
|
169
|
+
timestamp: datetime.strftime(Logging.config[:logging_timestamp_format]),
|
170
|
+
progname: program_name, severity: severity_level, msg: message)
|
168
171
|
end
|
169
172
|
|
170
|
-
|
171
|
-
def init_java_logger(level, logger_name = nil, source_location = nil)
|
173
|
+
def init_ruby_logger(level = nil, logger_name = nil, source_location = nil)
|
172
174
|
logger_name = get_formatted_logger_name(logger_name)
|
173
|
-
logger_name = source_location.split(
|
174
|
-
|
175
|
-
|
176
|
-
|
175
|
+
logger_name = source_location.split(FORWARD_SLASH_PATTERN).last if logger_name.empty?
|
176
|
+
log = Logger.new($stdout, progname: logger_name)
|
177
|
+
log.level = level.to_s unless level.nil?
|
178
|
+
log.formatter = method(:ruby_log_formatter)
|
179
|
+
log
|
180
|
+
end
|
181
|
+
|
182
|
+
def init_java_logger(level = nil, logger_name = nil, source_location = nil)
|
183
|
+
logger_name = get_formatted_logger_name(logger_name)
|
184
|
+
logger_name = source_location.split(FORWARD_SLASH_PATTERN).last if logger_name.empty?
|
185
|
+
log = LogManager.getLogger(logger_name)
|
186
|
+
log.level = Level.to_level(level.to_s.upcase) unless level.nil?
|
187
|
+
log
|
177
188
|
end
|
178
|
-
# rubocop: enable Metrics/AbcSize
|
179
189
|
|
180
190
|
def get_formatted_logger_name(logger_name = nil)
|
181
191
|
return logger_name.to_s[/\w+$/] unless logger_name.nil?
|
@@ -202,14 +212,13 @@ module Logging
|
|
202
212
|
when 1 then :info
|
203
213
|
when 0 then :debug
|
204
214
|
when -1 then :trace
|
205
|
-
when -
|
215
|
+
when -Float::INFINITY..-2 then :all
|
206
216
|
end
|
207
217
|
end
|
208
218
|
# rubocop: enable Metrics/CyclomaticComplexity
|
209
|
-
module_function :symbolize_numeric_log_level
|
210
219
|
|
211
|
-
def log_level=(
|
212
|
-
Logging.config[:level] = symbolize_numeric_log_level(
|
220
|
+
def log_level=(level)
|
221
|
+
Logging.config[:level] = symbolize_numeric_log_level(level)
|
213
222
|
end
|
214
223
|
module_function :log_level=
|
215
224
|
|
@@ -218,7 +227,7 @@ module Logging
|
|
218
227
|
end
|
219
228
|
module_function :log_level
|
220
229
|
|
221
|
-
def log(level = Logging.log_level, log_name =
|
230
|
+
def log(level = Logging.log_level, log_name = Logging.config[:app_name])
|
222
231
|
@log ||= init_logger(level, log_name)
|
223
232
|
end
|
224
233
|
alias logger log
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -24,7 +24,7 @@ module Server
|
|
24
24
|
@parser = option_parser
|
25
25
|
@options = ::Server.server_config.dup
|
26
26
|
@flags = %i[banner port ssl idle_reading idle_writing log_requests log_level help version]
|
27
|
-
@flags.each { |method_name| method(method_name)
|
27
|
+
@flags.each { |method_name| method(method_name)&.call if respond_to?(method_name) }
|
28
28
|
end
|
29
29
|
|
30
30
|
def banner
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -37,7 +37,7 @@ module Server
|
|
37
37
|
super()
|
38
38
|
@channel_group = channel_group
|
39
39
|
@options = options
|
40
|
-
@user_handlers =
|
40
|
+
@user_handlers = options.fetch(:handlers, [])
|
41
41
|
@decoder = StringDecoder.new
|
42
42
|
@encoder = StringEncoder.new
|
43
43
|
end
|
data/lib/server/config.rb
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -28,9 +28,10 @@ module Server
|
|
28
28
|
|
29
29
|
# The InstanceMethods module
|
30
30
|
module InstanceMethods
|
31
|
-
def configure_handlers(&block)
|
31
|
+
def configure_handlers(*handlers, &block)
|
32
32
|
add_listener(self)
|
33
33
|
channel_initializer << block if block_given?
|
34
|
+
add_listener(*handlers)
|
34
35
|
end
|
35
36
|
|
36
37
|
def bootstrap
|
data/lib/server/listenable.rb
CHANGED
data/lib/server/server.rb
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -24,9 +24,10 @@ module Server
|
|
24
24
|
include ::Server::InstanceMethods
|
25
25
|
attr_reader :options
|
26
26
|
|
27
|
-
def initialize(
|
28
|
-
|
29
|
-
|
27
|
+
def initialize(options = {}, *handlers, &block)
|
28
|
+
raise ArgumentError, 'Parameter may not be nil: options' if options.nil?
|
29
|
+
@options = ::Server.server_config.merge(options)
|
30
|
+
configure_handlers(*handlers, &block)
|
30
31
|
end
|
31
32
|
|
32
33
|
# rubocop: disable Metrics/AbcSize
|
data/lib/server/shutdown_hook.rb
CHANGED
data/lib/server/version.rb
CHANGED
@@ -6,11 +6,11 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
13
|
# The Server module
|
14
14
|
module Server
|
15
|
-
VERSION = '1.
|
15
|
+
VERSION = '1.1.2'.freeze
|
16
16
|
end
|
data/lib/server.rb
CHANGED
@@ -8,38 +8,29 @@
|
|
8
8
|
|
9
9
|
# =begin
|
10
10
|
#
|
11
|
-
# Copyright Nels Nelson 2016-
|
11
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
12
12
|
#
|
13
13
|
# =end
|
14
14
|
|
15
|
-
require_relative '
|
15
|
+
require_relative 'logging'
|
16
16
|
require_relative 'server/argument_parser'
|
17
17
|
require_relative 'server/server'
|
18
18
|
|
19
19
|
# The Server module
|
20
20
|
module Server
|
21
|
-
InterruptTemplate = "\r%<class>s".freeze
|
22
|
-
|
23
|
-
# rubocop: disable Metrics/AbcSize
|
24
|
-
# rubocop: disable Metrics/MethodLength
|
25
21
|
def main(args = parse_arguments)
|
26
22
|
Logging.log_level = args[:log_level]
|
27
|
-
|
28
|
-
server.add_listener(::Server::Demo.new)
|
29
|
-
server.run
|
23
|
+
::Server::Server.new(args, ::Server::Demo.new).run
|
30
24
|
rescue Interrupt => e
|
31
|
-
warn format(
|
25
|
+
warn format("\r%<class>s", class: e.class)
|
32
26
|
exit
|
33
27
|
rescue StandardError => e
|
34
28
|
::Server.log.fatal(e)
|
35
29
|
e.backtrace.each { |t| ::Server.log.fatal t }
|
36
30
|
exit 1
|
37
31
|
end
|
38
|
-
# rubocop: enable Metrics/AbcSize
|
39
|
-
# rubocop: enable Metrics/MethodLength
|
40
32
|
end
|
41
|
-
# module Server
|
42
33
|
|
43
34
|
require_relative 'demo_listener'
|
44
35
|
|
45
|
-
Object.new.extend(
|
36
|
+
Object.new.extend(Server).main if $PROGRAM_NAME == __FILE__
|
data/lib/tcp-server.rb
CHANGED
data/lib/tcp_server.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.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Nels Nelson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -17,13 +17,14 @@ dependencies:
|
|
17
17
|
- !ruby/object:Gem::Version
|
18
18
|
version: 2.17.1
|
19
19
|
name: apache-log4j-2
|
20
|
-
prerelease: false
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.17.1
|
27
|
+
force_ruby_platform: false
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
@@ -31,13 +32,14 @@ dependencies:
|
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: 1.70.1
|
33
34
|
name: bouncycastle
|
34
|
-
prerelease: false
|
35
35
|
type: :runtime
|
36
|
+
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
39
|
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: 1.70.1
|
42
|
+
force_ruby_platform: false
|
41
43
|
- !ruby/object:Gem::Dependency
|
42
44
|
requirement: !ruby/object:Gem::Requirement
|
43
45
|
requirements:
|
@@ -45,55 +47,14 @@ dependencies:
|
|
45
47
|
- !ruby/object:Gem::Version
|
46
48
|
version: 4.1.74
|
47
49
|
name: netty-io
|
48
|
-
prerelease: false
|
49
50
|
type: :runtime
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 4.1.74
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: 12.3.0
|
61
|
-
name: rake
|
62
|
-
prerelease: false
|
63
|
-
type: :development
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 12.3.0
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
-
requirements:
|
72
|
-
- - "~>"
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version: 3.11.0
|
75
|
-
name: rspec
|
76
|
-
prerelease: false
|
77
|
-
type: :development
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 3.11.0
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
requirement: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - "~>"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: 1.25.0
|
89
|
-
name: rubocop
|
90
51
|
prerelease: false
|
91
|
-
type: :development
|
92
52
|
version_requirements: !ruby/object:Gem::Requirement
|
93
53
|
requirements:
|
94
54
|
- - "~>"
|
95
55
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.
|
56
|
+
version: 4.1.74
|
57
|
+
force_ruby_platform: false
|
97
58
|
description: TCP Server for JRuby is a tcp server which supports a demo echo server
|
98
59
|
application.
|
99
60
|
email: nels@nelsnelson.org
|
@@ -108,7 +69,7 @@ files:
|
|
108
69
|
- exe/tcp_server
|
109
70
|
- lib/client.rb
|
110
71
|
- lib/demo_listener.rb
|
111
|
-
- lib/
|
72
|
+
- lib/logging.rb
|
112
73
|
- lib/server.rb
|
113
74
|
- lib/server/argument_parser.rb
|
114
75
|
- lib/server/channel_initializer.rb
|
@@ -144,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
105
|
- !ruby/object:Gem::Version
|
145
106
|
version: '0'
|
146
107
|
requirements: []
|
147
|
-
rubygems_version: 3.
|
108
|
+
rubygems_version: 3.3.26
|
148
109
|
signing_key:
|
149
110
|
specification_version: 4
|
150
111
|
summary: TCP Server for JRuby packaged as a gem.
|