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 +4 -4
- data/README.md +9 -9
- data/lib/websocket/arguments_parser.rb +27 -11
- data/lib/websocket/instance_methods.rb +6 -18
- data/lib/websocket/listenable.rb +1 -21
- data/lib/websocket/version.rb +1 -1
- data/lib/websocket_client.rb +79 -34
- data/lib/websocket_server.rb +12 -9
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efeef05a280e5bd37c7aac5e935d3be061d0d2e3cc8058af0beb431a6ac91b2f
|
4
|
+
data.tar.gz: ebe9d73d1f5c6cb9939551957531c78c5e93a93ffede7a6d2b14ac233ffd60ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
│ │ └──
|
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
|
-
|
175
|
+
├── websocket.rb
|
176
|
+
└── websocket_server.png
|
177
177
|
|
178
|
-
|
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
|
-
|
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
|
-
|
43
|
-
|
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
|
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::
|
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 ||=
|
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)
|
data/lib/websocket/listenable.rb
CHANGED
@@ -16,26 +16,6 @@ require 'java'
|
|
16
16
|
module WebSocket
|
17
17
|
# The Listenable module
|
18
18
|
module Listenable
|
19
|
-
|
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
|
data/lib/websocket/version.rb
CHANGED
data/lib/websocket_client.rb
CHANGED
@@ -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
|
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
|
268
|
-
listeners.
|
273
|
+
def replace_listeners(*listener)
|
274
|
+
listeners.clear
|
275
|
+
add_listener(*listener)
|
269
276
|
end
|
270
277
|
|
271
|
-
def notify(
|
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
|
-
|
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(
|
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
|
-
#
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
parser.
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
end
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
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
|
-
#
|
462
|
-
|
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)
|
data/lib/websocket_server.rb
CHANGED
@@ -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
|
27
|
-
format(
|
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(
|
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(
|
40
|
+
warn format("\r%<class>s", class: e.class)
|
42
41
|
exit
|
43
42
|
rescue StandardError => e
|
44
|
-
|
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.
|
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-
|
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
|
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
|
26
|
+
version: 1.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
29
29
|
requirements:
|