websocket-server 1.0.1-java → 1.1.1-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: 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: