tcp-server 1.1.4-java → 1.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33f9e64d109b0bdcc53bfe8cda1c4d113106cc7a9d1f6e423cfb4fd6a9fcff52
4
- data.tar.gz: 9663b9e88b11d643b51292a705fbbb0ea8509fc288b175404a76b021c8edc945
3
+ metadata.gz: e929584365fe9f6f2f5acd5730590308d9ccf84b7cafc7cb611fe80290014891
4
+ data.tar.gz: bd0148f3ebe104cc69dd4ed9f37dd68733c3a9e9dcca711184a5dc5e940005b8
5
5
  SHA512:
6
- metadata.gz: dadc64a13e62cf4981b28d1d1b1d8c90748c30ff9164a646ac5cea2a294efca2916389e608b8510733333a1f66add302e43d3a537eab7f665eba2acac45ccf96
7
- data.tar.gz: 72ff75a438437b1005f8d6bc8d8d3b00e3dcc96b3f4d2f17c86db1800e0e22b4ee46a9ac5621e36998741d181c81b01f6b4e1f12beea52c7237da546061bcefa
6
+ metadata.gz: 6260d608a17649fe1114e0e9382398e56297a9430ac9755c516578317d2e691fde6063e096847fc9f24e5d9ce8d34b940bf1a798433e19cb736be8ad1d956ca1
7
+ data.tar.gz: 28e72cd37f04f4a958c638841a8742e13f991c89e91977c9298978695c8801eb29d1ca6c8a71e28ac7e6d3aea37c4022c4998e8a1fe1d308111bf0f0b7162e49
data/lib/demo_listener.rb CHANGED
@@ -10,21 +10,16 @@
10
10
  #
11
11
  # =end
12
12
 
13
+ require_relative 'server/default_handler'
14
+
13
15
  # The Server module
14
16
  module Server
15
17
  # The Demo class
16
18
  class Demo
17
- def channel_active(ctx)
18
- ::Server.log.info "Channel active: #{ctx.channel}"
19
- response = 'Hello, world!'
20
- log.trace "Sending response: #{response.inspect}"
21
- ctx.channel.writeAndFlush("#{response}\n")
22
- end
19
+ include Server::DefaultHandler
23
20
 
24
- def exception_caught(_ctx, cause)
25
- ::Server.log.error "Exception caught: #{cause}"
26
- cause.backtrace.each { |t| ::Server.log.error t }
27
- ctx.close()
21
+ def initialize(options = {})
22
+ @options = options
28
23
  end
29
24
  end
30
25
  end
data/lib/server/config.rb CHANGED
@@ -17,21 +17,36 @@ require 'logger'
17
17
 
18
18
  # The Server module
19
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
+
20
35
  # rubocop: disable Metrics/MethodLength
21
36
  def server_config
22
37
  @server_config ||= {
23
- host: '0.0.0.0',
24
- port: Server::DEFAULT_PORT,
25
- ssl: false,
26
- idle_reading: 5 * 60, # seconds
27
- idle_writing: 30, # seconds
28
- max_queued_incoming_connections: Server::DEFAULT_MAX_QUEUED_INCOMING_CONNECTIONS,
29
- log_requests: false,
30
- log_level: Logger::INFO,
31
- quit_commands: %i[bye cease desist exit leave quit stop terminate],
32
- max_frame_length: 8192,
33
- keep_alive: Server::DEFAULT_KEEP_ALIVE,
34
- delimiter: Java::io.netty.handler.codec.Delimiters.lineDelimiter
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
+ max_frame_length: DEFAULT_MAX_FRAME_LENGTH,
47
+ keep_alive: DEFAULT_KEEP_ALIVE,
48
+ delimiter: DEFAULT_DELIMITER,
49
+ quit_commands: DEFAULT_QUIT_COMMANDS
35
50
  }.freeze
36
51
  end
37
52
  module_function :server_config
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: false
3
+
4
+ # -*- mode: ruby -*-
5
+ # vi: set ft=ruby :
6
+
7
+ # =begin
8
+ #
9
+ # Copyright Nels Nelson 2016-2024 but freely usable (see license)
10
+ #
11
+ # =end
12
+
13
+ # The Server module
14
+ module Server
15
+ # The DefaultHandler module
16
+ module DefaultHandler
17
+ def channel_active(ctx)
18
+ ::Server.log.info "Channel active: #{ctx.channel}"
19
+ response = 'Hello, world!'
20
+ log.trace "Sending response: #{response.inspect}"
21
+ ctx.channel.writeAndFlush("#{response}\n")
22
+ end
23
+
24
+ # rubocop: disable Metrics/AbcSize
25
+ def message_received(ctx, msg)
26
+ return if msg.nil?
27
+ msg.chomp! if msg.respond_to?(:chomp!)
28
+ return if msg.respond_to?(:empty?) && msg.empty?
29
+ log.trace "##{__method__} channel: #{ctx.channel}, message: #{msg.inspect}"
30
+ return ctx.close() if @options[:quit_commands].include?(msg.downcase.to_sym)
31
+ response = msg.upcase
32
+ log.debug "Sending response: #{response.inspect}"
33
+ ctx.writeAndFlush("#{response}\n")
34
+ end
35
+ # rubocop: enable Metrics/AbcSize
36
+
37
+ def exception_caught(_ctx, cause)
38
+ ::Server.log.error "Exception caught: #{cause}"
39
+ cause.backtrace.each { |t| ::Server.log.error t }
40
+ ctx.close()
41
+ end
42
+ end
43
+ end
@@ -14,6 +14,7 @@ require 'java'
14
14
  require 'netty'
15
15
 
16
16
  require_relative 'channel_initializer'
17
+ require_relative 'default_handler'
17
18
  require_relative 'shutdown_hook'
18
19
 
19
20
  # The Server module
@@ -28,6 +29,8 @@ module Server
28
29
 
29
30
  # The InstanceMethods module
30
31
  module InstanceMethods
32
+ include ::Server::DefaultHandler
33
+
31
34
  # rubocop: disable Metrics/AbcSize
32
35
  def bootstrap
33
36
  @bootstrap = ServerBootstrap.new
@@ -41,7 +44,6 @@ module Server
41
44
  # rubocop: enable Metrics/AbcSize
42
45
 
43
46
  def configure_handlers(*handlers, &block)
44
- add_listener(self)
45
47
  channel_initializer << block if block_given?
46
48
  add_listener(*handlers)
47
49
  end
@@ -91,11 +93,7 @@ module Server
91
93
  # rubocop: enable Metrics/MethodLength
92
94
 
93
95
  def port
94
- @port ||= begin
95
- value = @options[:port]
96
- value = DEFAULT_PORT if value.nil?
97
- value.to_i
98
- end
96
+ @port ||= (@options[:port] || DEFAULT_PORT).to_i
99
97
  end
100
98
 
101
99
  def shutdown
@@ -123,8 +121,7 @@ module Server
123
121
  def keep_alive
124
122
  @keep_alive ||= begin
125
123
  value = @options[:keep_alive]
126
- value = DEFAULT_KEEP_ALIVE if value.nil?
127
- value
124
+ value || DEFAULT_KEEP_ALIVE
128
125
  end
129
126
  end
130
127
 
@@ -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
@@ -21,30 +21,18 @@ 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
27
24
  include ::Server::InstanceMethods
28
25
  attr_reader :options
29
26
 
30
27
  def initialize(options = {}, *handlers, &block)
31
28
  raise ArgumentError, 'Parameter may not be nil: options' if options.nil?
32
29
  @options = ::Server.server_config.merge(options)
33
- configure_handlers(*handlers, &block)
30
+ log.trace "##{__method__} handlers: #{handlers}"
31
+ configure_handlers(*(handlers.empty? ? [self] : handlers), &block)
32
+ ensure
33
+ listeners = channel_initializer.default_handler.listeners
34
+ log.trace "##{__method__} listeners: #{listeners}"
34
35
  end
35
-
36
- # rubocop: disable Metrics/AbcSize
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?
41
- log.trace "##{__method__} channel: #{ctx.channel}, message: #{msg.inspect}"
42
- return ctx.close() if @options[:quit_commands].include?(msg.downcase.to_sym)
43
- response = msg.upcase
44
- log.debug "Sending response: #{response.inspect}"
45
- ctx.writeAndFlush("#{response}\n")
46
- end
47
- # rubocop: enable Metrics/AbcSize
48
36
  end
49
37
  # class Server
50
38
  end
@@ -12,5 +12,5 @@
12
12
 
13
13
  # The Server module
14
14
  module Server
15
- VERSION = '1.1.4'.freeze
15
+ VERSION = '1.2.0'.freeze
16
16
  end
data/lib/server.rb CHANGED
@@ -12,6 +12,7 @@
12
12
  #
13
13
  # =end
14
14
 
15
+ require_relative 'demo_listener'
15
16
  require_relative 'logging'
16
17
  require_relative 'server/argument_parser'
17
18
  require_relative 'server/server'
@@ -20,7 +21,8 @@ require_relative 'server/server'
20
21
  module Server
21
22
  def main(args = parse_arguments)
22
23
  Logging.log_level = args[:log_level]
23
- ::Server::Server.new(args, ::Server::Demo.new).run
24
+ demo_handler = ::Server::Demo.new(args)
25
+ ::Server::Server.new(args, demo_handler).run
24
26
  rescue Interrupt => e
25
27
  warn format("\r%<class>s", class: e.class)
26
28
  exit
@@ -31,6 +33,4 @@ module Server
31
33
  end
32
34
  end
33
35
 
34
- require_relative 'demo_listener'
35
-
36
36
  Object.new.extend(Server).main if $PROGRAM_NAME == __FILE__
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
4
+ version: 1.2.0
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-04-12 00:00:00.000000000 Z
11
+ date: 2024-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +74,7 @@ files:
74
74
  - lib/server/argument_parser.rb
75
75
  - lib/server/channel_initializer.rb
76
76
  - lib/server/config.rb
77
+ - lib/server/default_handler.rb
77
78
  - lib/server/instance_methods.rb
78
79
  - lib/server/listenable.rb
79
80
  - lib/server/message_handler.rb