websocket-server 1.0.1-java → 1.1.2-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{LICENSE → LICENSE.txt} +1 -1
- data/README.md +30 -31
- data/exe/websocket +1 -1
- data/lib/{log.rb → logging.rb} +90 -81
- data/lib/server/mime_types.rb +1 -1
- data/lib/websocket/arguments_parser.rb +28 -12
- data/lib/websocket/channel_initializer.rb +1 -1
- data/lib/websocket/config.rb +1 -1
- data/lib/websocket/encoding.rb +1 -1
- data/lib/websocket/file_server_channel_progressive_future_listener.rb +1 -1
- data/lib/websocket/frame_handler.rb +1 -1
- data/lib/websocket/header_helpers.rb +1 -1
- data/lib/websocket/http_static_file_server_handler.rb +1 -1
- data/lib/websocket/http_static_file_server_handler_instance_methods.rb +5 -6
- data/lib/websocket/idle_handler.rb +2 -1
- data/lib/websocket/idle_state_user_event_handler.rb +1 -1
- data/lib/websocket/instance_methods.rb +7 -19
- data/lib/websocket/listenable.rb +2 -24
- data/lib/websocket/message_handler.rb +1 -1
- data/lib/websocket/response_helpers.rb +3 -3
- data/lib/websocket/server.rb +1 -3
- data/lib/websocket/shutdown_hook.rb +1 -2
- data/lib/websocket/ssl_cipher_inspector.rb +2 -1
- data/lib/websocket/ssl_context_initialization.rb +1 -1
- data/lib/websocket/telnet_proxy.rb +1 -1
- data/lib/websocket/validation_helpers.rb +9 -13
- data/lib/websocket/version.rb +2 -2
- data/lib/websocket-server.rb +1 -1
- data/lib/websocket_client.rb +83 -39
- data/lib/websocket_server.rb +16 -11
- metadata +8 -49
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -23,6 +23,7 @@ module WebSocket
|
|
23
23
|
# server pipeline.
|
24
24
|
class IdleHandler < WebSocket::IdleStateUserEventHandler
|
25
25
|
def initialize
|
26
|
+
# Include additional subclass initialization here.
|
26
27
|
super()
|
27
28
|
end
|
28
29
|
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -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
@@ -6,36 +6,14 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
|
-
require 'java'
|
14
|
-
|
15
13
|
# The WebSocket module
|
16
14
|
module WebSocket
|
17
15
|
# The Listenable module
|
18
16
|
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
|
17
|
+
include ::Server::Listenable
|
38
18
|
end
|
39
|
-
# module Listenable
|
40
19
|
end
|
41
|
-
# module WebSocket
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -26,13 +26,13 @@ module WebSocket
|
|
26
26
|
|
27
27
|
# The ResponseHelpers helpers
|
28
28
|
module ResponseHelpers
|
29
|
-
|
29
|
+
NON_SPACES_BEFORE_EOL_PATTERN = %r{([^\s]+)$}
|
30
30
|
|
31
31
|
def index_listing(path)
|
32
32
|
results = `ls -la #{path}`.strip.split("\n")
|
33
33
|
results.shift
|
34
34
|
index = results.collect do |s|
|
35
|
-
s.gsub(
|
35
|
+
s.gsub(NON_SPACES_BEFORE_EOL_PATTERN) do |resource_name|
|
36
36
|
%(<a href="#{resource_name}">#{resource_name}</a>)
|
37
37
|
end
|
38
38
|
end.join '<br />'
|
data/lib/websocket/server.rb
CHANGED
@@ -6,12 +6,10 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
|
-
require 'java'
|
14
|
-
require 'netty'
|
15
13
|
require 'tcp-server'
|
16
14
|
|
17
15
|
require_relative 'instance_methods'
|
@@ -6,12 +6,11 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
13
|
require 'java'
|
14
|
-
require 'netty'
|
15
14
|
|
16
15
|
# The WebSocket module
|
17
16
|
module WebSocket
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
@@ -22,6 +22,7 @@ module WebSocket
|
|
22
22
|
# cipher configuration and pipeline handling of SSL handshakes.
|
23
23
|
class SslCipherInspector < SimpleChannelInboundHandler
|
24
24
|
def initialize
|
25
|
+
# Include additional subclass initialization here.
|
25
26
|
super()
|
26
27
|
end
|
27
28
|
|
@@ -6,41 +6,37 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
|
-
require 'java'
|
14
|
-
require 'netty'
|
15
|
-
|
16
13
|
require_relative 'encoding'
|
17
14
|
|
18
15
|
# The WebSocket module
|
19
16
|
module WebSocket
|
20
17
|
# The ValidationHelpers module
|
21
18
|
module ValidationHelpers
|
22
|
-
|
23
|
-
|
19
|
+
FILE_SEPARATOR_DOT_PATTERN = %r{#{File::SEPARATOR}\.}
|
20
|
+
DOT_FILE_SEPARATOR_PATTERN = %r{\.#{File::SEPARATOR}}
|
21
|
+
QUERY_STRING_PATTERN = %r{\?.*}
|
22
|
+
FORWARD_SLASH_PATTERN = %r{/}
|
24
23
|
|
25
24
|
# Simplistic dumb security check.
|
26
25
|
# Something more serious is required in a production environment.
|
27
26
|
def insecure_uri?(uri)
|
28
|
-
|
29
|
-
|
27
|
+
FILE_SEPARATOR_DOT_PATTERN.match?(uri) ||
|
28
|
+
DOT_FILE_SEPARATOR_PATTERN.match?(uri) ||
|
30
29
|
uri.start_with?('.') ||
|
31
30
|
uri.end_with?('.') ||
|
32
31
|
options[:insecure_uri_pattern].match?(uri)
|
33
32
|
end
|
34
33
|
|
35
|
-
QueryStringPattern = %r{\?.*}.freeze
|
36
|
-
ForwardSlashPattern = %r{/}.freeze
|
37
|
-
|
38
34
|
def sanitize_uri(uri)
|
39
35
|
# Decode the path.
|
40
|
-
uri = CGI.unescape(uri.gsub(
|
36
|
+
uri = CGI.unescape(uri.gsub(QUERY_STRING_PATTERN, ''), WebSocket::Encoding.name)
|
41
37
|
return nil if uri.empty? || !uri.start_with?('/')
|
42
38
|
# Convert file separators.
|
43
|
-
uri = uri.gsub(
|
39
|
+
uri = uri.gsub(FORWARD_SLASH_PATTERN, File::SEPARATOR)
|
44
40
|
return nil if insecure_uri?(uri)
|
45
41
|
# Convert to absolute path.
|
46
42
|
File.join(options[:web_root], uri)
|
data/lib/websocket/version.rb
CHANGED
@@ -6,11 +6,11 @@
|
|
6
6
|
|
7
7
|
# =begin
|
8
8
|
#
|
9
|
-
# Copyright Nels Nelson 2016-
|
9
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
10
10
|
#
|
11
11
|
# =end
|
12
12
|
|
13
13
|
# The WebSocket module
|
14
14
|
module WebSocket
|
15
|
-
VERSION = '1.
|
15
|
+
VERSION = '1.1.2'.freeze
|
16
16
|
end
|
data/lib/websocket-server.rb
CHANGED
data/lib/websocket_client.rb
CHANGED
@@ -8,16 +8,16 @@
|
|
8
8
|
|
9
9
|
# =begin
|
10
10
|
#
|
11
|
-
# Copyright Nels Nelson 2016-
|
11
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
12
12
|
#
|
13
13
|
# =end
|
14
14
|
|
15
|
+
require 'java'
|
15
16
|
require 'optparse'
|
16
17
|
|
17
|
-
require 'java'
|
18
18
|
require 'netty'
|
19
19
|
|
20
|
-
|
20
|
+
require_relative 'logging'
|
21
21
|
|
22
22
|
# Simple websocket client ported from the example from Netty-io.
|
23
23
|
|
@@ -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
|
@@ -326,7 +335,6 @@ module WebSocket
|
|
326
335
|
end
|
327
336
|
|
328
337
|
def exceptionCaught(ctx, cause)
|
329
|
-
log.info "##{__method__} wtf1"
|
330
338
|
cause.printStackTrace()
|
331
339
|
@handshake_future.setFailure(cause) unless @handshake_future.isDone()
|
332
340
|
ctx.close()
|
@@ -424,10 +432,8 @@ module WebSocket
|
|
424
432
|
session
|
425
433
|
end
|
426
434
|
|
427
|
-
IdentiferTemplate = '#<%<class>s:0x%<id>s>'.freeze
|
428
|
-
|
429
435
|
def to_s
|
430
|
-
format(
|
436
|
+
format('#<%<class>s:0x%<id>s>', class: self.class.name, id: object_id.to_s(16))
|
431
437
|
end
|
432
438
|
alias inspect to_s
|
433
439
|
end
|
@@ -436,31 +442,69 @@ end
|
|
436
442
|
|
437
443
|
# The WebSocket module
|
438
444
|
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
|
-
|
445
|
+
# The ArgumentsParser class
|
446
|
+
class ArgumentsParser
|
447
|
+
attr_reader :parser, :options
|
448
|
+
|
449
|
+
def initialize(parser = OptionParser.new, options = ::WebSocket.client_config.dup)
|
450
|
+
@parser = parser
|
451
|
+
@options = options
|
452
|
+
@flags = %i[banner uri log_level help version]
|
453
|
+
@flags.each { |method_name| method(method_name)&.call if respond_to?(method_name) }
|
454
|
+
end
|
455
|
+
|
456
|
+
def banner
|
457
|
+
@parser.banner = "Usage: #{File.basename($PROGRAM_NAME)} [options]"
|
458
|
+
@parser.separator ''
|
459
|
+
@parser.separator 'Options:'
|
460
|
+
end
|
461
|
+
|
462
|
+
def uri
|
463
|
+
@parser.on_head('-u', '--uri=<uri>', 'Fully qualified connection string') do |v|
|
464
|
+
@options[:uri] = java.net.URI.new(v)
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
def log_level
|
469
|
+
@parser.on_tail('-v', '--verbose', 'Increase verbosity') do
|
470
|
+
@options[:log_level] ||= 0
|
471
|
+
@options[:log_level] -= 1
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
def help
|
476
|
+
@parser.on_tail('-?', '--help', 'Show this message') do
|
477
|
+
puts @parser
|
478
|
+
exit
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
def version
|
483
|
+
@parser.on_tail('--version', 'Show version') do
|
484
|
+
puts "#{File.basename($PROGRAM_NAME)} version #{::WebSocket::VERSION}"
|
485
|
+
exit
|
486
|
+
end
|
487
|
+
end
|
460
488
|
end
|
461
|
-
#
|
462
|
-
|
489
|
+
# class ArgumentsParser
|
490
|
+
|
491
|
+
def parse_arguments(arguments_parser = ArgumentsParser.new)
|
492
|
+
arguments_parser.parser.parse!(ARGV)
|
493
|
+
arguments_parser.parse_positional_arguments!
|
494
|
+
arguments_parser.options
|
495
|
+
rescue OptionParser::InvalidArgument, OptionParser::InvalidOption,
|
496
|
+
OptionParser::MissingArgument, OptionParser::NeedlessArgument => e
|
497
|
+
puts e.message
|
498
|
+
puts parser
|
499
|
+
exit
|
500
|
+
rescue OptionParser::AmbiguousOption => e
|
501
|
+
abort e.message
|
502
|
+
end
|
503
|
+
end
|
504
|
+
# module WebSocket
|
463
505
|
|
506
|
+
# The WebSocket module
|
507
|
+
module WebSocket
|
464
508
|
def main(args = parse_arguments)
|
465
509
|
Logging.log_level = args[:log_level]
|
466
510
|
::WebSocket::Client.new(args)
|
@@ -475,4 +519,4 @@ module WebSocket
|
|
475
519
|
end
|
476
520
|
# module WebSocket
|
477
521
|
|
478
|
-
Object.new.extend(
|
522
|
+
Object.new.extend(WebSocket).main if $PROGRAM_NAME == __FILE__
|
data/lib/websocket_server.rb
CHANGED
@@ -8,42 +8,47 @@
|
|
8
8
|
|
9
9
|
# =begin
|
10
10
|
#
|
11
|
-
# Copyright Nels Nelson 2016-
|
11
|
+
# Copyright Nels Nelson 2016-2024 but freely usable (see license)
|
12
12
|
#
|
13
13
|
# =end
|
14
14
|
|
15
|
-
|
15
|
+
require 'java'
|
16
|
+
|
17
|
+
require_relative 'logging'
|
16
18
|
require_relative 'websocket/arguments_parser'
|
17
19
|
require_relative 'websocket/server'
|
18
20
|
require_relative 'websocket/telnet_proxy'
|
19
21
|
|
20
22
|
# The WebSocket module
|
21
23
|
module WebSocket
|
22
|
-
EchoServerMessageTemplate = "%<message>s\n".freeze
|
23
|
-
InterruptTemplate = "\r%<class>s".freeze
|
24
|
-
|
25
24
|
def echo_server(options)
|
26
|
-
WebSocket::Server.new(options
|
27
|
-
format(
|
25
|
+
::WebSocket::Server.new(options) do |_ctx, msg|
|
26
|
+
format("%<message>s\n", message: msg.upcase)
|
28
27
|
end.run
|
29
28
|
end
|
30
29
|
|
31
30
|
def telnet_proxy(options)
|
32
|
-
handler = WebSocket::TelnetProxy.new(options[:telnet_proxy_host], options[:telnet_proxy_port])
|
33
|
-
WebSocket::Server.new(
|
31
|
+
handler = ::WebSocket::TelnetProxy.new(options[:telnet_proxy_host], options[:telnet_proxy_port])
|
32
|
+
::WebSocket::Server.new(options, handler).run
|
34
33
|
end
|
35
34
|
|
35
|
+
# rubocop: disable Metrics/AbcSize
|
36
|
+
# rubocop: disable Metrics/MethodLength
|
36
37
|
def main(args = parse_arguments)
|
37
38
|
Logging.log_level = args[:log_level]
|
38
39
|
return telnet_proxy(args) unless args[:telnet_proxy_host].nil?
|
39
40
|
echo_server(args)
|
40
41
|
rescue Interrupt => e
|
41
|
-
warn format(
|
42
|
+
warn format("\r%<class>s", class: e.class)
|
42
43
|
exit
|
43
44
|
rescue StandardError => e
|
44
|
-
|
45
|
+
puts Logging.log_level
|
46
|
+
::WebSocket::Server.log.fatal(e.message)
|
47
|
+
e.backtrace.each { |t| WebSocket::Server.log.debug t }
|
45
48
|
abort
|
46
49
|
end
|
50
|
+
# rubocop: enable Metrics/AbcSize
|
51
|
+
# rubocop: enable Metrics/MethodLength
|
47
52
|
end
|
48
53
|
# module WebSocket
|
49
54
|
|
metadata
CHANGED
@@ -1,71 +1,30 @@
|
|
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.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Nels Nelson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-04 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.
|
18
|
+
version: 1.1.3
|
19
19
|
name: tcp-server
|
20
|
-
prerelease: false
|
21
20
|
type: :runtime
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 1.0.5
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
requirement: !ruby/object:Gem::Requirement
|
29
|
-
requirements:
|
30
|
-
- - "~>"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 12.3.0
|
33
|
-
name: rake
|
34
|
-
prerelease: false
|
35
|
-
type: :development
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 12.3.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 3.11.0
|
47
|
-
name: rspec
|
48
|
-
prerelease: false
|
49
|
-
type: :development
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 3.11.0
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: 1.25.0
|
61
|
-
name: rubocop
|
62
21
|
prerelease: false
|
63
|
-
type: :development
|
64
22
|
version_requirements: !ruby/object:Gem::Requirement
|
65
23
|
requirements:
|
66
24
|
- - "~>"
|
67
25
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
26
|
+
version: 1.1.3
|
27
|
+
force_ruby_platform: false
|
69
28
|
description: Websocket Server for JRuby is a websocket server with a file server to
|
70
29
|
support a demo javascript client application which interfaces with a demo echo server
|
71
30
|
application.
|
@@ -75,11 +34,11 @@ executables:
|
|
75
34
|
extensions: []
|
76
35
|
extra_rdoc_files: []
|
77
36
|
files:
|
78
|
-
- LICENSE
|
37
|
+
- LICENSE.txt
|
79
38
|
- README.md
|
80
39
|
- Rakefile
|
81
40
|
- exe/websocket
|
82
|
-
- lib/
|
41
|
+
- lib/logging.rb
|
83
42
|
- lib/server/mime_types.rb
|
84
43
|
- lib/websocket-server.rb
|
85
44
|
- lib/websocket/arguments_parser.rb
|
@@ -138,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
97
|
- !ruby/object:Gem::Version
|
139
98
|
version: '0'
|
140
99
|
requirements: []
|
141
|
-
rubygems_version: 3.
|
100
|
+
rubygems_version: 3.3.26
|
142
101
|
signing_key:
|
143
102
|
specification_version: 4
|
144
103
|
summary: Websocket Server for JRuby packaged as a gem.
|