tcp-server 1.0.6-java → 1.0.7-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 +14 -8
- data/lib/client.rb +31 -20
- data/lib/log.rb +86 -49
- data/lib/server/argument_parser.rb +3 -2
- data/lib/server/channel_initializer.rb +6 -7
- data/lib/server/config.rb +10 -4
- data/lib/server/message_handler.rb +2 -2
- data/lib/server/modular_handler.rb +1 -1
- data/lib/server/server.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: 119b17b7637a9d30ba40c82660e9b2c9eebbabbe59264cbb49e88b82cef6805c
|
4
|
+
data.tar.gz: 5fa1261d06c758e2934944f79fc9f747d73f387dd4e2ed04cb119fe496a34010
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d911168c44588f3c89b557b800bde9cbaf5603185c4c850bf6362c8e24458110ed2b1c33ea8736032d7003d01068a4e7b7bf58151e334adab2b1fef2adba251
|
7
|
+
data.tar.gz: f2863e4c56547ae3f8af9f1b37085863ffefd3f5ffd07eb46a1e288c72694189ff52e44c7fdb1e1b20ee68c8b841a93699e9d32a2ad4defff093e8ac265b567a
|
data/README.md
CHANGED
@@ -18,7 +18,9 @@ You may run the websocket server in a container. The [`colima`](https://github.c
|
|
18
18
|
|
19
19
|
```sh
|
20
20
|
colima start
|
21
|
-
docker-compose up
|
21
|
+
docker-compose up --detach
|
22
|
+
nc localhost 4000
|
23
|
+
docker-compose down
|
22
24
|
```
|
23
25
|
|
24
26
|
Building the image or running the container:
|
@@ -57,8 +59,7 @@ Download and install the latest version of [JRuby].
|
|
57
59
|
|
58
60
|
```sh
|
59
61
|
asdf plugin add ruby
|
60
|
-
|
61
|
-
# ~/.asdf/plugins/ruby/bin/list-all
|
62
|
+
asdf plugin update --all
|
62
63
|
asdf list all ruby
|
63
64
|
asdf install ruby jruby-9.3.4.0
|
64
65
|
```
|
@@ -123,7 +124,7 @@ Here is a bird's-eye view of the project layout.
|
|
123
124
|
|
124
125
|
```sh
|
125
126
|
# date && tree -I "logs|vendor|tmp"
|
126
|
-
|
127
|
+
Tue Jun 28 20:25:51 CDT 2022
|
127
128
|
.
|
128
129
|
├── Dockerfile
|
129
130
|
├── Gemfile
|
@@ -157,7 +158,7 @@ Thu Jun 16 00:03:23 CDT 2022
|
|
157
158
|
│ ├── test_spec.rb
|
158
159
|
│ └── verify
|
159
160
|
│ └── verify_spec.rb
|
160
|
-
├── tcp-server-1.0.
|
161
|
+
├── tcp-server-1.0.6-java.gem
|
161
162
|
├── tcp-server-jruby.gemspec
|
162
163
|
├── tcp_server.png
|
163
164
|
└── tcp_server.rb
|
@@ -165,6 +166,7 @@ Thu Jun 16 00:03:23 CDT 2022
|
|
165
166
|
5 directories, 31 files
|
166
167
|
```
|
167
168
|
|
169
|
+
|
168
170
|
## CI linting
|
169
171
|
|
170
172
|
Use the GitLab CI Linting API to validate the syntax of a CI definition file.
|
@@ -173,12 +175,13 @@ Use the GitLab CI Linting API to validate the syntax of a CI definition file.
|
|
173
175
|
jq --null-input --arg yaml "$(<.gitlab/ci/gem.gitlab-ci.yml)" '.content=$yaml' | curl --silent --location https://gitlab.com/api/v4/ci/lint --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" --header "Content-Type: application/json" --data @- | jq --raw-output '.errors[0]'
|
174
176
|
```
|
175
177
|
|
178
|
+
|
176
179
|
## CI configuration
|
177
180
|
|
178
181
|
Generate a deploy key.
|
179
182
|
|
180
183
|
```sh
|
181
|
-
ssh-keygen -t ed25519 -C deploy_key
|
184
|
+
ssh-keygen -t ed25519 -P '' -C deploy_key -f deploy_key_ed25519
|
182
185
|
```
|
183
186
|
|
184
187
|
Use the GitLab Project-level Variables API to add the deploy key as a ssh private key variable.
|
@@ -186,18 +189,21 @@ Use the GitLab Project-level Variables API to add the deploy key as a ssh privat
|
|
186
189
|
```sh
|
187
190
|
project_path="nelsnelson/$(basename $(pwd))"
|
188
191
|
|
192
|
+
# Test auth token validity
|
193
|
+
curl --silent --show-error --location "https://gitlab.com/api/v4/projects" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" | jq '.[0]["id"]'
|
194
|
+
|
189
195
|
project=$(curl --silent --show-error --location "https://gitlab.com/api/v4/search?scope=projects&search=${project_path}" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" | jq --arg project_path "${project_path}" '.[] | select(.path_with_namespace == $project_path)')
|
190
196
|
|
191
197
|
project_id=$(curl --silent --show-error --location "https://gitlab.com/api/v4/search?scope=projects&search=${project_path}" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" | jq --arg project_path "${project_path}" '.[] | select(.path_with_namespace == $project_path) | .id')
|
192
198
|
|
193
199
|
# Add the deploy_token as a CI variable:
|
194
|
-
curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/projects/${project_id}/variables" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" --form "key=SSH_PRIVATE_KEY" --form "value=$(cat ./
|
200
|
+
curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/projects/${project_id}/variables" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" --form "key=SSH_PRIVATE_KEY" --form "value=$(cat ./deploy_key_ed25519)" --form "protected=true" | jq
|
195
201
|
```
|
196
202
|
|
197
203
|
Use the Deploy keys API to add a the public deploy key as a deploy key for the project.
|
198
204
|
|
199
205
|
```sh
|
200
|
-
curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/projects/${project_id}/deploy_keys" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" --
|
206
|
+
curl --silent --show-error --location --request POST "https://gitlab.com/api/v4/projects/${project_id}/deploy_keys" --header "PRIVATE-TOKEN: ${GITLAB_COM_API_PRIVATE_TOKEN}" --form "title=deploy_key" --form "key=$(cat ./deploy_key_ed25519.pub)" --form "can_push=true" | jq
|
201
207
|
```
|
202
208
|
|
203
209
|
[license]: https://gitlab.com/nelsnelson/tcp-server-jruby/blob/master/LICENSE
|
data/lib/client.rb
CHANGED
@@ -12,11 +12,12 @@
|
|
12
12
|
#
|
13
13
|
# =end
|
14
14
|
|
15
|
-
require 'optparse'
|
16
|
-
|
17
15
|
require 'java'
|
18
16
|
require 'netty'
|
19
17
|
|
18
|
+
require 'logger'
|
19
|
+
require 'optparse'
|
20
|
+
|
20
21
|
require 'log'
|
21
22
|
|
22
23
|
# The Client module
|
@@ -26,16 +27,23 @@ end
|
|
26
27
|
|
27
28
|
# The Client module
|
28
29
|
module Client
|
29
|
-
#
|
30
|
-
|
31
|
-
|
30
|
+
# rubocop: disable Metrics/MethodLength
|
31
|
+
def client_config
|
32
|
+
@client_config ||= {
|
33
|
+
host: '0.0.0.0',
|
32
34
|
port: 8080,
|
33
|
-
host: 'localhost',
|
34
35
|
ssl: false,
|
35
|
-
|
36
|
-
|
36
|
+
idle_reading: 5 * 60, # seconds
|
37
|
+
idle_writing: 30, # seconds
|
38
|
+
log_requests: false,
|
39
|
+
log_level: Logger::INFO,
|
40
|
+
quit_commands: %i[bye cease desist exit leave quit stop terminate],
|
41
|
+
max_frame_length: 8192,
|
42
|
+
delimiter: Java::io.netty.handler.codec.Delimiters.lineDelimiter
|
37
43
|
}.freeze
|
38
44
|
end
|
45
|
+
# rubocop: enable Metrics/MethodLength
|
46
|
+
module_function :client_config
|
39
47
|
end
|
40
48
|
|
41
49
|
# The Client module
|
@@ -77,8 +85,8 @@ module Client
|
|
77
85
|
end
|
78
86
|
|
79
87
|
def configure_handlers(*handlers, &block)
|
80
|
-
|
81
|
-
listeners.addAll(handlers)
|
88
|
+
channel_initializer.default_handler.add_listener(self)
|
89
|
+
channel_initializer.default_handler.listeners.addAll(handlers)
|
82
90
|
@user_app = block
|
83
91
|
@application_handler = lambda do |ctx, msg|
|
84
92
|
if @user_app.nil? || @user_app.arity == 1
|
@@ -342,12 +350,11 @@ module Client
|
|
342
350
|
|
343
351
|
# The ChannelInitializer class
|
344
352
|
class ChannelInitializer < Java::io.netty.channel.ChannelInitializer
|
345
|
-
DefaultHandler = ::Client::ModularHandler.new
|
346
|
-
FrameDecoderBufferSize = 8192 # bytes
|
347
353
|
# The encoder and decoder are sharable. If they were not, then
|
348
354
|
# constant definitions could not be used.
|
349
|
-
|
350
|
-
|
355
|
+
DECODER = StringDecoder.new
|
356
|
+
ENCODER = StringEncoder.new
|
357
|
+
MAX_FRAME_LENGTH = 8192
|
351
358
|
attr_accessor :handlers
|
352
359
|
|
353
360
|
def initialize(options = {})
|
@@ -366,12 +373,16 @@ module Client
|
|
366
373
|
pipeline = channel.pipeline
|
367
374
|
pipeline.addLast(ssl_handler(channel)) if @options[:ssl]
|
368
375
|
pipeline.addLast(
|
369
|
-
DelimiterBasedFrameDecoder.new(
|
370
|
-
|
371
|
-
|
376
|
+
DelimiterBasedFrameDecoder.new(MAX_FRAME_LENGTH, Delimiters.lineDelimiter()),
|
377
|
+
DECODER,
|
378
|
+
ENCODER
|
372
379
|
)
|
373
380
|
add_user_handlers(pipeline)
|
374
|
-
pipeline.addLast(
|
381
|
+
pipeline.addLast(default_handler)
|
382
|
+
end
|
383
|
+
|
384
|
+
def default_handler
|
385
|
+
@default_handler ||= ::Client::ModularHandler.new
|
375
386
|
end
|
376
387
|
|
377
388
|
protected
|
@@ -424,7 +435,7 @@ module TCP
|
|
424
435
|
include ::Client::Listenable
|
425
436
|
|
426
437
|
def initialize(options = {}, *handlers, &block)
|
427
|
-
init(::Client
|
438
|
+
init(::Client.client_config.merge(options))
|
428
439
|
configure_handlers(*handlers, &block)
|
429
440
|
connect
|
430
441
|
session
|
@@ -447,7 +458,7 @@ module Client
|
|
447
458
|
Flags = %i[banner port ssl log_level help version].freeze
|
448
459
|
attr_reader :parser, :options
|
449
460
|
|
450
|
-
def initialize(parser = OptionParser.new, options = ::Client
|
461
|
+
def initialize(parser = OptionParser.new, options = ::Client.client_config.dup)
|
451
462
|
@parser = parser
|
452
463
|
@options = options
|
453
464
|
Flags.each { |method_name| method(method_name).call }
|
data/lib/log.rb
CHANGED
@@ -12,56 +12,98 @@ require 'logger'
|
|
12
12
|
|
13
13
|
require 'log4j-2'
|
14
14
|
|
15
|
+
require 'fileutils'
|
16
|
+
|
17
|
+
# The Logging module
|
18
|
+
module Logging
|
19
|
+
# rubocop: disable Metrics/MethodLength
|
20
|
+
def config
|
21
|
+
@config ||= begin
|
22
|
+
lib_dir_path = File.expand_path(__dir__)
|
23
|
+
project_dir_path = File.expand_path(File.dirname(lib_dir_path))
|
24
|
+
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'))
|
26
|
+
{
|
27
|
+
level: :info,
|
28
|
+
name: 'tcp-server',
|
29
|
+
lib_dir_path: lib_dir_path,
|
30
|
+
project_dir_path: project_dir_path,
|
31
|
+
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',
|
35
|
+
schedule: '0 0 0 * * ?',
|
36
|
+
size: '100M'
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
module_function :config
|
41
|
+
# rubocop: enable Metrics/MethodLength
|
42
|
+
end
|
43
|
+
|
15
44
|
# The LogInitialization module
|
16
45
|
module LogInitialization
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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], '')
|
57
|
+
end
|
58
|
+
module_function :init_log_file
|
26
59
|
|
27
60
|
# rubocop: disable Metrics/AbcSize
|
28
61
|
# rubocop: disable Metrics/MethodLength
|
29
|
-
def
|
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
|
+
|
30
68
|
java.lang::System.setProperty('log4j.shutdownHookEnabled', java.lang::Boolean.toString(false))
|
31
69
|
factory = org.apache.logging.log4j.core.config.builder.api::ConfigurationBuilderFactory
|
32
70
|
config = factory.newConfigurationBuilder()
|
33
71
|
|
34
|
-
|
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
|
35
77
|
config.setStatusLevel(log_level)
|
36
|
-
config.setConfigurationName('
|
78
|
+
config.setConfigurationName(Logging.config['name'])
|
37
79
|
|
38
|
-
#
|
80
|
+
# Create a console appender
|
39
81
|
target = org.apache.logging.log4j.core.appender::ConsoleAppender::Target::SYSTEM_OUT
|
40
82
|
layout = config.newLayout('PatternLayout')
|
41
|
-
layout = layout.addAttribute('pattern',
|
83
|
+
layout = layout.addAttribute('pattern', Logging.config[:logger_pattern_template])
|
42
84
|
appender = config.newAppender('stdout', 'CONSOLE')
|
43
85
|
appender = appender.addAttribute('target', target)
|
44
86
|
appender = appender.add(layout)
|
45
87
|
config.add(appender)
|
46
88
|
|
47
|
-
#
|
89
|
+
# Create a root logger
|
48
90
|
root_logger = config.newRootLogger(log_level)
|
49
91
|
root_logger = root_logger.add(config.newAppenderRef('stdout'))
|
50
92
|
|
51
|
-
#
|
93
|
+
# Create a rolling file appender
|
52
94
|
cron = config.newComponent('CronTriggeringPolicy')
|
53
|
-
cron = cron.addAttribute('schedule',
|
95
|
+
cron = cron.addAttribute('schedule', Logging.config[:schedule])
|
54
96
|
|
55
97
|
size = config.newComponent('SizeBasedTriggeringPolicy')
|
56
|
-
size = size.addAttribute('size',
|
98
|
+
size = size.addAttribute('size', Logging.config[:size])
|
57
99
|
|
58
100
|
policies = config.newComponent('Policies')
|
59
101
|
policies = policies.addComponent(cron)
|
60
102
|
policies = policies.addComponent(size)
|
61
103
|
|
62
104
|
appender = config.newAppender('rolling_file', 'RollingFile')
|
63
|
-
appender = appender.addAttribute('fileName',
|
64
|
-
appender = appender.addAttribute('filePattern',
|
105
|
+
appender = appender.addAttribute('fileName', server_log_file)
|
106
|
+
appender = appender.addAttribute('filePattern', rolling_log_file_path)
|
65
107
|
appender = appender.add(layout)
|
66
108
|
appender = appender.addComponent(policies)
|
67
109
|
config.add(appender)
|
@@ -77,10 +119,11 @@ module LogInitialization
|
|
77
119
|
# rubocop: enable Metrics/AbcSize
|
78
120
|
# rubocop: enable Metrics/MethodLength
|
79
121
|
# def init_log4j
|
122
|
+
module_function :init_log4j
|
80
123
|
end
|
81
124
|
# module LogInitialization
|
82
125
|
|
83
|
-
::LogInitialization.
|
126
|
+
::LogInitialization.init
|
84
127
|
|
85
128
|
# The Apache log4j Logger class
|
86
129
|
# rubocop: disable Style/ClassAndModuleChildren
|
@@ -113,35 +156,14 @@ end
|
|
113
156
|
|
114
157
|
# The Logging module
|
115
158
|
module Logging
|
116
|
-
|
117
|
-
Configuration = {
|
118
|
-
level: Logger::INFO
|
119
|
-
}
|
120
|
-
# rubocop: enable Style/MutableConstant
|
121
|
-
|
122
|
-
def self.log_level=(log_level)
|
123
|
-
Logging::Configuration[:level] = log_level
|
124
|
-
end
|
125
|
-
|
126
|
-
def self.log_level
|
127
|
-
Logging::Configuration[:level]
|
128
|
-
end
|
129
|
-
|
130
|
-
def log(level = Logging.log_level, log_name = nil)
|
131
|
-
@log ||= init_logger(level, log_name)
|
132
|
-
end
|
133
|
-
alias logger log
|
134
|
-
|
135
|
-
protected
|
136
|
-
|
137
|
-
def init_logger(level = Logging.log_level, logger_name = nil)
|
159
|
+
def init_logger(level = :all, logger_name = nil)
|
138
160
|
return init_java_logger(level, logger_name, caller[2]) if defined?(Java)
|
139
|
-
|
161
|
+
init_ruby_logger(level)
|
140
162
|
end
|
141
163
|
|
142
|
-
def init_ruby_logger(level
|
143
|
-
logger_instance = Logger.new
|
144
|
-
logger_instance.level = level
|
164
|
+
def init_ruby_logger(level)
|
165
|
+
logger_instance = Logger.new
|
166
|
+
logger_instance.level = Logging::Level.to_level(level.to_s.upcase)
|
145
167
|
logger_instance
|
146
168
|
end
|
147
169
|
|
@@ -149,9 +171,8 @@ module Logging
|
|
149
171
|
def init_java_logger(level, logger_name = nil, source_location = nil)
|
150
172
|
logger_name = get_formatted_logger_name(logger_name)
|
151
173
|
logger_name = source_location.split(/\//).last if logger_name.empty?
|
152
|
-
level_name = symbolize_numeric_log_level(level).to_s.upcase
|
153
174
|
logger_instance = org.apache.logging.log4j.LogManager.getLogger(logger_name)
|
154
|
-
logger_instance.level = org.apache.logging.log4j.Level.to_level(
|
175
|
+
logger_instance.level = org.apache.logging.log4j.Level.to_level(level.to_s.upcase)
|
155
176
|
logger_instance
|
156
177
|
end
|
157
178
|
# rubocop: enable Metrics/AbcSize
|
@@ -185,6 +206,22 @@ module Logging
|
|
185
206
|
end
|
186
207
|
end
|
187
208
|
# rubocop: enable Metrics/CyclomaticComplexity
|
209
|
+
module_function :symbolize_numeric_log_level
|
210
|
+
|
211
|
+
def log_level=(log_level)
|
212
|
+
Logging.config[:level] = symbolize_numeric_log_level(log_level)
|
213
|
+
end
|
214
|
+
module_function :log_level=
|
215
|
+
|
216
|
+
def log_level
|
217
|
+
Logging.config[:level]
|
218
|
+
end
|
219
|
+
module_function :log_level
|
220
|
+
|
221
|
+
def log(level = Logging.log_level, log_name = nil)
|
222
|
+
@log ||= init_logger(level, log_name)
|
223
|
+
end
|
224
|
+
alias logger log
|
188
225
|
end
|
189
226
|
# module Logging
|
190
227
|
|
@@ -26,7 +26,7 @@ module Server
|
|
26
26
|
|
27
27
|
def initialize(option_parser = OptionParser.new)
|
28
28
|
@parser = option_parser
|
29
|
-
@options = ::Server
|
29
|
+
@options = ::Server.server_config.dup
|
30
30
|
Flags.each { |method_name| method(method_name).call }
|
31
31
|
end
|
32
32
|
|
@@ -76,7 +76,8 @@ module Server
|
|
76
76
|
|
77
77
|
def log_level
|
78
78
|
@parser.on_tail('-v', '--verbose', 'Increase verbosity') do
|
79
|
-
@options
|
79
|
+
current_level = @options.fetch(:log_level, 0)
|
80
|
+
@options[:log_level] = current_level - 1
|
80
81
|
end
|
81
82
|
end
|
82
83
|
|
@@ -30,11 +30,10 @@ module Server
|
|
30
30
|
|
31
31
|
# The ChannelInitializer class
|
32
32
|
class ChannelInitializer < Java::io.netty.channel.ChannelInitializer
|
33
|
-
FrameDecoderBufferBytesSize = 8192
|
34
33
|
# The encoder and decoder are sharable. If they were not, then
|
35
34
|
# constant definitions could not be used.
|
36
|
-
|
37
|
-
|
35
|
+
DECODER = StringDecoder.new
|
36
|
+
ENCODER = StringEncoder.new
|
38
37
|
attr_accessor :user_handlers
|
39
38
|
attr_reader :options
|
40
39
|
|
@@ -42,7 +41,7 @@ module Server
|
|
42
41
|
super()
|
43
42
|
@channel_group = channel_group
|
44
43
|
@options = options
|
45
|
-
@user_handlers = []
|
44
|
+
@user_handlers = @options.fetch(:handlers, [])
|
46
45
|
end
|
47
46
|
|
48
47
|
def <<(handler)
|
@@ -53,9 +52,9 @@ module Server
|
|
53
52
|
pipeline = channel.pipeline
|
54
53
|
pipeline.addLast(ssl_handler(channel)) if @options[:ssl]
|
55
54
|
pipeline.addLast(
|
56
|
-
DelimiterBasedFrameDecoder.new(
|
57
|
-
|
58
|
-
|
55
|
+
DelimiterBasedFrameDecoder.new(@options[:max_frame_length], @options[:delimiter]),
|
56
|
+
DECODER,
|
57
|
+
ENCODER
|
59
58
|
)
|
60
59
|
add_user_handlers(pipeline)
|
61
60
|
pipeline.addLast(default_handler)
|
data/lib/server/config.rb
CHANGED
@@ -10,13 +10,15 @@
|
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
|
+
require 'netty'
|
14
|
+
|
13
15
|
require 'logger'
|
14
16
|
|
15
17
|
# The Server module
|
16
18
|
module Server
|
17
|
-
#
|
18
|
-
|
19
|
-
|
19
|
+
# rubocop: disable Metrics/MethodLength
|
20
|
+
def server_config
|
21
|
+
@server_config ||= {
|
20
22
|
host: '0.0.0.0',
|
21
23
|
port: 8080,
|
22
24
|
ssl: false,
|
@@ -24,7 +26,11 @@ module Server
|
|
24
26
|
idle_writing: 30, # seconds
|
25
27
|
log_requests: false,
|
26
28
|
log_level: Logger::INFO,
|
27
|
-
quit_commands: %i[bye quit]
|
29
|
+
quit_commands: %i[bye cease desist exit leave quit stop terminate],
|
30
|
+
max_frame_length: 8192,
|
31
|
+
delimiter: Java::io.netty.handler.codec.Delimiters.lineDelimiter
|
28
32
|
}.freeze
|
29
33
|
end
|
34
|
+
module_function :server_config
|
35
|
+
# rubocop: enable Metrics/MethodLength
|
30
36
|
end
|
@@ -39,7 +39,7 @@ module Server
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def messageReceived(ctx, msg)
|
42
|
-
log.trace "##{
|
42
|
+
log.trace "##{__method__} channel: #{ctx.channel}, message: #{msg.inspect}"
|
43
43
|
msg&.chomp!
|
44
44
|
log.info "Received message: #{msg}"
|
45
45
|
return super(ctx, msg) unless respond_to?(:handle_message) && @handler.arity == 2
|
@@ -49,7 +49,7 @@ module Server
|
|
49
49
|
def handle_message(ctx, message)
|
50
50
|
request = message.to_s.strip
|
51
51
|
response = @handler.call(ctx.channel, request).to_s.chomp
|
52
|
-
log.debug "response: #{response}"
|
52
|
+
log.debug "##{__method__} response: #{response}"
|
53
53
|
ctx.channel.writeAndFlush("#{response}\n")
|
54
54
|
end
|
55
55
|
end
|
data/lib/server/server.rb
CHANGED
@@ -25,7 +25,7 @@ module Server
|
|
25
25
|
attr_reader :options
|
26
26
|
|
27
27
|
def initialize(params = {}, &block)
|
28
|
-
@options = ::Server
|
28
|
+
@options = ::Server.server_config.merge(params.fetch(:options, {}))
|
29
29
|
configure_handlers(&block)
|
30
30
|
end
|
31
31
|
|
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.0.
|
4
|
+
version: 1.0.7
|
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-06-
|
11
|
+
date: 2022-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|