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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 670f9e3c8b79da3a1479990814950e144ad3a198a4f5225ecbbd22c2df490a6d
4
- data.tar.gz: 6dd98be9542a0120e7fdb1f85f2b0965dce8cd2599bfa04059e9e9b8c3a20f99
3
+ metadata.gz: 07e7184d3ca0f9e6db19db9d7de0561690ca2afe3aa17d66c29e4883591938f5
4
+ data.tar.gz: b70a0d40bddcb3f5fbda8079873612db7f033ce5d9c62c28ab9fd1a1eb9b59de
5
5
  SHA512:
6
- metadata.gz: cc3a5219e0b6b39a4977c389a857b977c7a1daae20348d07b0602b323576f088f697593bcbc54a39504e0f59f558d617c10c87eb4628c7c723963fe6ebd1c758
7
- data.tar.gz: ed6bbe76a0993e5b71d709180752eb235ae41d7bac2e5ed45edd5ba07043cf75dfe3f306dc255d76dedf64ad1c5b21ff724664044175292a1be2b3f045a96c2c
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
- ### Docker
15
+ ### Container
16
16
 
17
- You may run the websocket server in a container. The [`colima`](https://github.com/abiosoft/colima) for a container runtime is recommended.
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
- The [asdf] CLI tool used to manage multiple runtime versions.
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
- Wed Jul 20 13:18:23 CDT 2022
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
- │ ├── log.rb
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, 30 files
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://asdf-vm.com/
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
@@ -8,7 +8,7 @@
8
8
 
9
9
  # =begin
10
10
 
11
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
11
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
12
12
 
13
13
  # =end
14
14
 
data/lib/client.rb CHANGED
@@ -8,22 +8,16 @@
8
8
 
9
9
  # =begin
10
10
  #
11
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
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 'log'
18
+ require 'netty'
22
19
 
23
- # The Client module
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 #{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(InterruptTemplate, class: e.class)
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
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
@@ -28,4 +28,3 @@ module Server
28
28
  end
29
29
  end
30
30
  end
31
- # module Server
@@ -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-2019 but freely usable (see license)
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
- server_log_file = File.expand_path(File.join(logs_dir_path, 'server.log'))
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: :info,
28
- name: 'tcp-server',
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
- server_log_file: server_log_file,
33
- rolling_log_file_name_template: 'server-%d{yyyy-MM-dd}.log.gz',
34
- logger_pattern_template: '%d{ABSOLUTE} %-5p [%c{1}] %m%n',
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 LogInitialization module
45
- module LogInitialization
46
- def init
47
- init_log_file
48
- init_log4j if defined? Java
49
- end
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
- factory = org.apache.logging.log4j.core.config.builder.api::ConfigurationBuilderFactory
70
- config = factory.newConfigurationBuilder()
64
+ config = ConfigurationBuilderFactory.newConfigurationBuilder()
71
65
 
72
- if log_level.is_a?(Symbol)
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(Logging.config['name'])
68
+ config.setConfigurationName('websocket')
79
69
 
80
- # Create a console appender
81
- target = org.apache.logging.log4j.core.appender::ConsoleAppender::Target::SYSTEM_OUT
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', Logging.config[:logger_pattern_template])
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
- # Create a root logger
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
- # Create a rolling file appender
84
+ # create a rolling file appender
94
85
  cron = config.newComponent('CronTriggeringPolicy')
95
- cron = cron.addAttribute('schedule', Logging.config[:schedule])
86
+ cron = cron.addAttribute('schedule', '0 0 0 * * ?')
96
87
 
97
88
  size = config.newComponent('SizeBasedTriggeringPolicy')
98
- size = size.addAttribute('size', Logging.config[: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', server_log_file)
106
- appender = appender.addAttribute('filePattern', rolling_log_file_path)
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 = org.apache.logging.log4j.core.config::Configurator.initialize(logging_configuration)
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
- # The Apache log4j Logger class
129
- # rubocop: disable Style/ClassAndModuleChildren
130
- class org.apache.logging.log4j.core::Logger
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| log4j_error(trace) unless trace.nil? }
129
+ error.backtrace.each { |trace| original_error(trace) unless trace.nil? }
148
130
  elsif error.respond_to?(:getStackTrace)
149
- error.getStackTrace().each { |trace| log4j_error(trace) unless trace.nil? }
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
- # rubocop: enable Style/ClassAndModuleChildren
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
- def init_logger(level = :all, logger_name = nil)
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 init_ruby_logger(level)
165
- logger_instance = Logger.new
166
- logger_instance.level = Logging::Level.to_level(level.to_s.upcase)
167
- logger_instance
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
- # rubocop: disable Metrics/AbcSize
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(/\//).last if logger_name.empty?
174
- logger_instance = org.apache.logging.log4j.LogManager.getLogger(logger_name)
175
- logger_instance.level = org.apache.logging.log4j.Level.to_level(level.to_s.upcase)
176
- logger_instance
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 -2..-Float::INFINITY then :all
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=(log_level)
212
- Logging.config[:level] = symbolize_numeric_log_level(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 = nil)
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-2022 but freely usable (see license)
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).call }
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-2022 but freely usable (see license)
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 = @options.fetch(: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-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
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
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
data/lib/server/server.rb CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
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(params = {}, &block)
28
- @options = ::Server.server_config.merge(params.fetch(:options, {}))
29
- configure_handlers(&block)
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
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
@@ -6,11 +6,11 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
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.0.12'.freeze
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-2022 but freely usable (see license)
11
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
12
12
  #
13
13
  # =end
14
14
 
15
- require_relative 'log'
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
- server = ::Server::Server.new(options: args)
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(InterruptTemplate, class: e.class)
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(::Server).main if $PROGRAM_NAME == __FILE__
36
+ Object.new.extend(Server).main if $PROGRAM_NAME == __FILE__
data/lib/tcp-server.rb CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
data/lib/tcp_server.rb CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  # =begin
8
8
  #
9
- # Copyright Nels Nelson 2016-2022 but freely usable (see license)
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
10
  #
11
11
  # =end
12
12
 
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.0.12
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: 2022-07-24 00:00:00.000000000 Z
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.25.0
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/log.rb
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.2.29
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.