websocket-server 1.0.1-java → 1.1.1-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: 7670d3a4e743e533e42467d4047741a0ea833cc4e7ea4d1855a1ed9b76138560
4
- data.tar.gz: d1d6b8efb9502a45b44d56267d8a76fc036d46e4169c15cf93fcc605202ded8c
3
+ metadata.gz: efeef05a280e5bd37c7aac5e935d3be061d0d2e3cc8058af0beb431a6ac91b2f
4
+ data.tar.gz: ebe9d73d1f5c6cb9939551957531c78c5e93a93ffede7a6d2b14ac233ffd60ab
5
5
  SHA512:
6
- metadata.gz: a7cf7669311ab73b6a1905cda6d8112052b32ddbd7da3ccfb6bcf36e36e3f1d66b8fabf11da1b0abe0dc29a61c96f10506c1a8c750f95a45a18f494e711ec24f
7
- data.tar.gz: 16e0b9f2221cd9a83de57266561ea8797f40ac7d6d717e6b67fef1e078f045a5b2a5605c25c5670bc6fdde6c5db48610b85786f0a5c1a79d2a7df20c366ef6d6
6
+ metadata.gz: f88e570186167360f06486585614c9b94dc85246aef73036f387908f3e9d7b286552fccec802b8b7e85826c6bc87cbf21010443e9f2485d2017ce4f74fe18af3
7
+ data.tar.gz: d35daddf002f5f847fcd05b0d2a1f0a89616a027c410fcac25a26183d957111b213ca8f65835c3a6936e5950b4aa21a267a6e4086cb617128489042f7cdfc788
data/README.md CHANGED
@@ -107,11 +107,10 @@ Here is a bird's-eye view of the project layout.
107
107
 
108
108
  ```sh
109
109
  # date && tree
110
- Wed Apr 6 23:05:28 CDT 2022
110
+ Sun Jul 24 22:53:59 CDT 2022
111
111
  .
112
112
  ├── Dockerfile
113
113
  ├── Gemfile
114
- ├── Gemfile.lock
115
114
  ├── LICENSE
116
115
  ├── README.md
117
116
  ├── Rakefile
@@ -119,10 +118,11 @@ Wed Apr 6 23:05:28 CDT 2022
119
118
  ├── exe
120
119
  │ └── websocket
121
120
  ├── lib
121
+ │ ├── client.rb
122
122
  │ ├── log.rb
123
123
  │ ├── server
124
124
  │ │ ├── mime_types.rb
125
- │ │ └── server.rb
125
+ │ │ └── modular_handler.rb
126
126
  │ ├── websocket
127
127
  │ │ ├── arguments_parser.rb
128
128
  │ │ ├── channel_initializer.rb
@@ -135,22 +135,20 @@ Wed Apr 6 23:05:28 CDT 2022
135
135
  │ │ ├── http_static_file_server_handler_instance_methods.rb
136
136
  │ │ ├── idle_handler.rb
137
137
  │ │ ├── idle_state_user_event_handler.rb
138
+ │ │ ├── instance_methods.rb
138
139
  │ │ ├── listenable.rb
139
140
  │ │ ├── message_handler.rb
140
- │ │ ├── modular_handler.rb
141
141
  │ │ ├── response_helpers.rb
142
142
  │ │ ├── server.rb
143
- │ │ ├── server_instance_methods.rb
144
143
  │ │ ├── shutdown_hook.rb
145
144
  │ │ ├── ssl_cipher_inspector.rb
146
145
  │ │ ├── ssl_context_initialization.rb
147
146
  │ │ ├── telnet_proxy.rb
148
147
  │ │ ├── validation_helpers.rb
149
148
  │ │ └── version.rb
149
+ │ ├── websocket-server.rb
150
150
  │ ├── websocket_client.rb
151
151
  │ └── websocket_server.rb
152
- ├── logs
153
- │ └── server.log
154
152
  ├── spec
155
153
  │ ├── spec_helper.rb
156
154
  │ ├── test_spec.rb
@@ -172,10 +170,12 @@ Wed Apr 6 23:05:28 CDT 2022
172
170
  │ │ ├── console.js
173
171
  │ │ └── websocket.js
174
172
  │ └── jquery.min.js
173
+ ├── websocket-server-1.0.1-java.gem
175
174
  ├── websocket-server-jruby.gemspec
176
- └── websocket.rb
175
+ ├── websocket.rb
176
+ └── websocket_server.png
177
177
 
178
- 13 directories, 52 files
178
+ 12 directories, 53 files
179
179
  ```
180
180
 
181
181
  [license]: https://gitlab.com/nelsnelson/websocket-server-jruby/blob/master/LICENSE
@@ -16,20 +16,21 @@ require_relative 'config'
16
16
 
17
17
  # The WebSocket module
18
18
  module WebSocket
19
+ # rubocop: disable Metrics/ClassLength
19
20
  # The ArgumentsParser class
20
21
  class ArgumentsParser
21
- Flags = %i[
22
- banner port telnet_proxy_host telnet_proxy_port
23
- ssl ssl_certificate ssl_private_key use_jdk_ssl_provider
24
- inspect_ssl idle_reading idle_writing log_requests web_root
25
- verbose help version
26
- ].freeze
27
22
  attr_reader :parser, :options
28
23
 
29
24
  def initialize(option_parser = OptionParser.new)
30
25
  @parser = option_parser
31
26
  @options = ::WebSocket.server_config.dup
32
- Flags.each { |method_name| method(method_name).call }
27
+ @flags = %i[
28
+ banner port telnet_proxy_host telnet_proxy_port
29
+ ssl ssl_certificate ssl_private_key use_jdk_ssl_provider
30
+ inspect_ssl idle_reading idle_writing log_requests web_root
31
+ verbose help version
32
+ ]
33
+ @flags.each { |method_name| method(method_name)&.call if respond_to?(method_name) }
33
34
  end
34
35
 
35
36
  def banner
@@ -38,9 +39,17 @@ module WebSocket
38
39
  @parser.separator 'Options:'
39
40
  end
40
41
 
42
+ def validated_port(val, integer_pattern = /^\d+$/)
43
+ raise OptionParser::InvalidArgument, "Invalid port: #{v}" unless \
44
+ integer_pattern.match?(val.to_s) && val.positive? && val < 65_536
45
+
46
+ val
47
+ end
48
+
41
49
  def port
42
- @parser.on_head('-p', '--port=port', 'Listen on this port for incoming connections') do |v|
43
- @options[:port] = v.to_i
50
+ description = "Port on which to listen for connections; default: #{@options[:port]}"
51
+ @parser.on('-p', '--port=<port>', Integer, description) do |v|
52
+ @options[:port] = validated_port(v).to_i
44
53
  end
45
54
  end
46
55
 
@@ -112,6 +121,7 @@ module WebSocket
112
121
 
113
122
  def verbose
114
123
  @parser.on_tail('-v', '--verbose', 'Increase verbosity') do
124
+ @options[:log_level] ||= 0
115
125
  @options[:log_level] -= 1
116
126
  end
117
127
  end
@@ -125,17 +135,23 @@ module WebSocket
125
135
 
126
136
  def version
127
137
  @parser.on_tail('--version', 'Show version') do
128
- puts "#{File.basename($PROGRAM_NAME)} version #{WebSocket.version}"
138
+ puts "#{File.basename($PROGRAM_NAME)} version #{::WebSocket::VERSION}"
129
139
  exit
130
140
  end
131
141
  end
132
142
  end
143
+ # rubocop: enable Metrics/ClassLength
133
144
  # class ArgumentsParser
134
145
 
135
146
  def parse_arguments(arguments_parser = WebSocket::ArgumentsParser.new)
136
147
  arguments_parser.parser.parse!(ARGV)
137
148
  arguments_parser.options
138
- rescue OptionParser::InvalidOption, OptionParser::AmbiguousOption => e
149
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption,
150
+ OptionParser::MissingArgument, OptionParser::NeedlessArgument => e
151
+ puts e.message
152
+ puts parser
153
+ exit
154
+ rescue OptionParser::AmbiguousOption => e
139
155
  abort e.message
140
156
  end
141
157
  end
@@ -63,36 +63,24 @@ module WebSocket
63
63
  # rubocop: disable Metrics/AbcSize
64
64
  # rubocop: disable Metrics/MethodLength
65
65
  def run(params = {})
66
- options.merge!(params)
66
+ @options.merge!(params)
67
67
  channel = bootstrap.bind(port).sync().channel()
68
68
  channel_group.add(channel)
69
69
  ::WebSocket::ShutdownHook.new(self)
70
70
  log.info "Listening on #{channel.local_address}"
71
71
  channel.closeFuture().sync()
72
72
  rescue java.net.BindException => e
73
- raise "Bind error: #{e.message}: #{options[:host]}:#{port}"
73
+ raise "Bind error: #{e.message}: #{@options[:host]}:#{port}"
74
74
  rescue java.net.SocketException => e
75
- raise "Socket error: #{e.message}: #{options[:host]}:#{port}"
75
+ raise "Socket error: #{e.message}: #{@options[:host]}:#{port}"
76
76
  ensure
77
77
  stop
78
78
  end
79
79
  # rubocop: enable Metrics/AbcSize
80
80
  # rubocop: enable Metrics/MethodLength
81
81
 
82
- IntegerPattern = /^\d+$/.freeze
83
-
84
- def valid_port?(val)
85
- IntegerPattern.match?(val.to_s) && val.positive? && val < 65_536
86
- end
87
-
88
- def given_port
89
- value = (options[:ssl] ? options[:ssl_port] : options[:port]).to_i
90
- raise 'Given port parameter is invalid' unless valid_port?(value)
91
- value
92
- end
93
-
94
82
  def port
95
- @port ||= given_port
83
+ @port ||= (@options[:ssl] ? @options[:ssl_port] : @options[:port]).to_i
96
84
  end
97
85
 
98
86
  def shutdown
@@ -109,8 +97,8 @@ module WebSocket
109
97
  channel_initializer.handlers << handler
110
98
  end
111
99
 
112
- def add_listener(listener)
113
- channel_initializer.add_listener(listener)
100
+ def add_listener(*listener)
101
+ channel_initializer.add_listener(*listener)
114
102
  end
115
103
 
116
104
  # def all_exist?(*files)
@@ -16,26 +16,6 @@ require 'java'
16
16
  module WebSocket
17
17
  # The Listenable module
18
18
  module Listenable
19
- def listeners
20
- @listeners ||= java.util.concurrent.CopyOnWriteArrayList.new
21
- end
22
-
23
- def add_listener(listener)
24
- listeners << listener
25
- end
26
-
27
- def remove_listener(listener)
28
- listeners.delete(listener)
29
- end
30
-
31
- def notify(message, *args)
32
- return if listeners.empty?
33
- log.trace "Notifying listeners (#{listeners}) of message: #{message}"
34
- listeners.each do |listener|
35
- listener.send(message.to_sym, *args) if listener.respond_to?(message.to_sym)
36
- end
37
- end
19
+ include ::Server::Listenable
38
20
  end
39
- # module Listenable
40
21
  end
41
- # module WebSocket
@@ -12,5 +12,5 @@
12
12
 
13
13
  # The WebSocket module
14
14
  module WebSocket
15
- VERSION = '1.0.1'.freeze
15
+ VERSION = '1.1.1'.freeze
16
16
  end
@@ -260,23 +260,32 @@ module WebSocket
260
260
  @listeners ||= java.util.concurrent.CopyOnWriteArrayList.new
261
261
  end
262
262
 
263
- def add_listener(listener)
264
- listeners << listener
263
+ def add_listener(*listener)
264
+ listeners.addAll(listener)
265
+ ensure
266
+ log.trace "Listeners: #{listeners}"
267
+ end
268
+
269
+ def remove_listener(*listener)
270
+ listeners.removeAll(listener)
265
271
  end
266
272
 
267
- def remove_listener(listener)
268
- listeners.delete(listener)
273
+ def replace_listeners(*listener)
274
+ listeners.clear
275
+ add_listener(*listener)
269
276
  end
270
277
 
271
- def notify(message, *args)
272
- return if listeners.empty?
273
- log.trace "Notifying listeners (#{listeners}) of message: #{message}"
278
+ def notify(event, *args)
274
279
  listeners.each do |listener|
275
- listener.send(message.to_sym, *args) if listener.respond_to?(message.to_sym)
280
+ next unless listener.respond_to?(event.to_sym)
281
+ log.trace "Notifying listener #{listener} of event: #{event}"
282
+ listener.send(event.to_sym, *args)
276
283
  end
277
284
  end
278
285
  end
286
+ # module Listenable
279
287
  end
288
+ # module WebSocket
280
289
 
281
290
  # The WebSocket module
282
291
  module WebSocket
@@ -424,10 +433,8 @@ module WebSocket
424
433
  session
425
434
  end
426
435
 
427
- IdentiferTemplate = '#<%<class>s:0x%<id>s>'.freeze
428
-
429
436
  def to_s
430
- format(IdentiferTemplate, class: self.class.name, id: object_id.to_s(16))
437
+ format('#<%<class>s:0x%<id>s>', class: self.class.name, id: object_id.to_s(16))
431
438
  end
432
439
  alias inspect to_s
433
440
  end
@@ -436,31 +443,69 @@ end
436
443
 
437
444
  # The WebSocket module
438
445
  module WebSocket
439
- # rubocop: disable Metrics/AbcSize
440
- # rubocop: disable Metrics/MethodLength
441
- def parse_arguments(options = ::WebSocket.client_config.dup)
442
- parser = OptionParser.new
443
- parser.banner = "Usage: #{File.basename($PROGRAM_NAME)} [options]"
444
- parser.separator ''
445
- parser.separator 'Options:'
446
- parser.on_head('-u', '--uri=<uri>', 'Fully qualified connection string') do |v|
447
- options[:uri] = java.net.URI.new(v)
448
- end
449
- parser.on_tail('-v', '--verbose', 'Increase verbosity') { options[:log_level] -= 1 }
450
- parser.on_tail('-?', '--help', 'Show this message') do
451
- puts parser
452
- exit
453
- end
454
- parser.on_tail('--version', 'Show version') do
455
- puts "#{$PROGRAM_NAME} version #{::WebSocket.version}"
456
- exit
457
- end
458
- parser.parse!
459
- options
446
+ # The ArgumentsParser class
447
+ class ArgumentsParser
448
+ attr_reader :parser, :options
449
+
450
+ def initialize(parser = OptionParser.new, options = ::WebSocket.client_config.dup)
451
+ @parser = parser
452
+ @options = options
453
+ @flags = %i[banner uri log_level help version]
454
+ @flags.each { |method_name| method(method_name)&.call if respond_to?(method_name) }
455
+ end
456
+
457
+ def banner
458
+ @parser.banner = "Usage: #{File.basename($PROGRAM_NAME)} [options]"
459
+ @parser.separator ''
460
+ @parser.separator 'Options:'
461
+ end
462
+
463
+ def uri
464
+ @parser.on_head('-u', '--uri=<uri>', 'Fully qualified connection string') do |v|
465
+ @options[:uri] = java.net.URI.new(v)
466
+ end
467
+ end
468
+
469
+ def log_level
470
+ @parser.on_tail('-v', '--verbose', 'Increase verbosity') do
471
+ @options[:log_level] ||= 0
472
+ @options[:log_level] -= 1
473
+ end
474
+ end
475
+
476
+ def help
477
+ @parser.on_tail('-?', '--help', 'Show this message') do
478
+ puts @parser
479
+ exit
480
+ end
481
+ end
482
+
483
+ def version
484
+ @parser.on_tail('--version', 'Show version') do
485
+ puts "#{File.basename($PROGRAM_NAME)} version #{::WebSocket::VERSION}"
486
+ exit
487
+ end
488
+ end
460
489
  end
461
- # rubocop: enable Metrics/AbcSize
462
- # rubocop: enable Metrics/MethodLength
490
+ # class ArgumentsParser
491
+
492
+ def parse_arguments(arguments_parser = ArgumentsParser.new)
493
+ arguments_parser.parser.parse!(ARGV)
494
+ arguments_parser.parse_positional_arguments!
495
+ arguments_parser.options
496
+ rescue OptionParser::InvalidArgument, OptionParser::InvalidOption,
497
+ OptionParser::MissingArgument, OptionParser::NeedlessArgument => e
498
+ puts e.message
499
+ puts parser
500
+ exit
501
+ rescue OptionParser::AmbiguousOption => e
502
+ abort e.message
503
+ end
504
+ end
505
+ # module WebSocket
463
506
 
507
+ # The WebSocket module
508
+ module WebSocket
464
509
  def main(args = parse_arguments)
465
510
  Logging.log_level = args[:log_level]
466
511
  ::WebSocket::Client.new(args)
@@ -19,31 +19,34 @@ require_relative 'websocket/telnet_proxy'
19
19
 
20
20
  # The WebSocket module
21
21
  module WebSocket
22
- EchoServerMessageTemplate = "%<message>s\n".freeze
23
- InterruptTemplate = "\r%<class>s".freeze
24
-
25
22
  def echo_server(options)
26
- WebSocket::Server.new(options: options) do |_ctx, msg|
27
- format(EchoServerMessageTemplate, message: msg.upcase)
23
+ ::WebSocket::Server.new(options) do |_ctx, msg|
24
+ format("%<message>s\n", message: msg.upcase)
28
25
  end.run
29
26
  end
30
27
 
31
28
  def telnet_proxy(options)
32
- handler = WebSocket::TelnetProxy.new(options[:telnet_proxy_host], options[:telnet_proxy_port])
33
- WebSocket::Server.new(handler: handler, options: options).run
29
+ handler = ::WebSocket::TelnetProxy.new(options[:telnet_proxy_host], options[:telnet_proxy_port])
30
+ ::WebSocket::Server.new(options, handler).run
34
31
  end
35
32
 
33
+ # rubocop: disable Metrics/AbcSize
34
+ # rubocop: disable Metrics/MethodLength
36
35
  def main(args = parse_arguments)
37
36
  Logging.log_level = args[:log_level]
38
37
  return telnet_proxy(args) unless args[:telnet_proxy_host].nil?
39
38
  echo_server(args)
40
39
  rescue Interrupt => e
41
- warn format(InterruptTemplate, class: e.class)
40
+ warn format("\r%<class>s", class: e.class)
42
41
  exit
43
42
  rescue StandardError => e
44
- WebSocket::Server.log.fatal(e.message)
43
+ puts Logging.log_level
44
+ ::WebSocket::Server.log.fatal(e.message)
45
+ e.backtrace.each { |t| WebSocket::Server.log.debug t }
45
46
  abort
46
47
  end
48
+ # rubocop: enable Metrics/AbcSize
49
+ # rubocop: enable Metrics/MethodLength
47
50
  end
48
51
  # module WebSocket
49
52
 
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: websocket-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.1
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-26 00:00:00.000000000 Z
11
+ date: 2022-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 1.0.5
18
+ version: 1.1.0
19
19
  name: tcp-server
20
20
  prerelease: false
21
21
  type: :runtime
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.5
26
+ version: 1.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements: