tiny_tcp_service 1.2.1 → 1.4.0
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/lib/tiny_tcp_service.rb +48 -44
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9153074bb46f8f6cbf51c4a864bfb2fa2eabb63232669d708e61502c931324dd
|
4
|
+
data.tar.gz: 401a36c00244ebecad0a6c8ee3cae185860edac655270d4cf4eb70f39392a097
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 77f635cb2880c4578db3c72f0190a47f4939dc1f479fc8583e6f39d3eb84368beb1cf1c1ca2f7d146309cb78b3427084a36e9a4e7ddc8b0e886793a496f5f96c
|
7
|
+
data.tar.gz: b7766536ee659434cdaa7d1055611784837baf6fb90f9f8e7675d8d29a519fe8d3df66dc84c8cf035f2b1645abaff63538fc263af429963448db11cc58b3507c
|
data/lib/tiny_tcp_service.rb
CHANGED
@@ -6,7 +6,6 @@ require 'socket'
|
|
6
6
|
# ->(m) { puts m }
|
7
7
|
# )
|
8
8
|
#
|
9
|
-
# s.start! # everything runs in background threads
|
10
9
|
# s.stop! # gracefully shutdown the server
|
11
10
|
#
|
12
11
|
# TinyTCPService implements a line-based, call and response protocol, where
|
@@ -27,52 +26,13 @@ class TinyTCPService
|
|
27
26
|
|
28
27
|
@server = TCPServer.new(port)
|
29
28
|
@clients = []
|
30
|
-
@running =
|
29
|
+
@running = true
|
31
30
|
|
32
31
|
@msg_handler = nil
|
33
32
|
@error_handlers = {}
|
34
|
-
end
|
35
|
-
|
36
|
-
# h - some object that responds to #call
|
37
|
-
def msg_handler=(h)
|
38
|
-
@msg_handler = h
|
39
|
-
end
|
40
|
-
|
41
|
-
# returns true if the server is running
|
42
|
-
# false otherwise
|
43
|
-
def running?
|
44
|
-
@running
|
45
|
-
end
|
46
|
-
|
47
|
-
# add the error handler and block for the specified class
|
48
|
-
#
|
49
|
-
# you can assume that the local variable name of the error will be `e'
|
50
|
-
def add_error_handler(klass, block)
|
51
|
-
@error_handlers[klass] = block
|
52
|
-
end
|
53
|
-
|
54
|
-
# remove the error handler associated with klass
|
55
|
-
def remove_error_handler(klass)
|
56
|
-
@error_handlers.delete(klass)
|
57
|
-
end
|
58
|
-
|
59
|
-
# returns the number of connected clients
|
60
|
-
def num_clients
|
61
|
-
@clients.length
|
62
|
-
end
|
63
|
-
|
64
|
-
def _remove_client!(c)
|
65
|
-
@clients.delete(c)
|
66
|
-
c.close if c && !c.closed?
|
67
|
-
end
|
68
|
-
|
69
|
-
# starts the server
|
70
|
-
def start!
|
71
|
-
return if running?
|
72
|
-
@running = true
|
73
33
|
|
74
34
|
# client accept thread
|
75
|
-
Thread.new do |t|
|
35
|
+
@thread = Thread.new do |t|
|
76
36
|
loop do
|
77
37
|
break unless running?
|
78
38
|
@clients << @server.accept
|
@@ -90,8 +50,14 @@ class TinyTCPService
|
|
90
50
|
readable, _, errored = IO.select(@clients, nil, @clients, 1)
|
91
51
|
readable&.each do |c|
|
92
52
|
begin
|
93
|
-
c.
|
94
|
-
|
53
|
+
m = c.gets&.chomp
|
54
|
+
|
55
|
+
if m.is_a?(String)
|
56
|
+
c.puts(@msg_handler&.call(m))
|
57
|
+
else
|
58
|
+
_remove_client!(c)
|
59
|
+
end
|
60
|
+
rescue TinyTCPService::BadClient, Errno::ECONNRESET => e
|
95
61
|
_remove_client!(c)
|
96
62
|
rescue => e
|
97
63
|
handler = @error_handlers[e.class]
|
@@ -112,6 +78,44 @@ class TinyTCPService
|
|
112
78
|
end
|
113
79
|
end
|
114
80
|
|
81
|
+
# join the service Thread if you want to wait until it's closed
|
82
|
+
def join
|
83
|
+
@thread.join
|
84
|
+
end
|
85
|
+
|
86
|
+
# h - some object that responds to #call
|
87
|
+
def msg_handler=(h)
|
88
|
+
@msg_handler = h
|
89
|
+
end
|
90
|
+
|
91
|
+
# returns true if the server is running
|
92
|
+
# false otherwise
|
93
|
+
def running?
|
94
|
+
@running
|
95
|
+
end
|
96
|
+
|
97
|
+
# add the error handler and block for the specified class
|
98
|
+
#
|
99
|
+
# you can assume that the local variable name of the error will be `e'
|
100
|
+
def add_error_handler(klass, block)
|
101
|
+
@error_handlers[klass] = block
|
102
|
+
end
|
103
|
+
|
104
|
+
# remove the error handler associated with klass
|
105
|
+
def remove_error_handler(klass)
|
106
|
+
@error_handlers.delete(klass)
|
107
|
+
end
|
108
|
+
|
109
|
+
# returns the number of connected clients
|
110
|
+
def num_clients
|
111
|
+
@clients.length
|
112
|
+
end
|
113
|
+
|
114
|
+
def _remove_client!(c)
|
115
|
+
@clients.delete(c)
|
116
|
+
c.close if c && !c.closed?
|
117
|
+
end
|
118
|
+
|
115
119
|
# stops the server gracefully
|
116
120
|
def stop!
|
117
121
|
@running = false
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tiny_tcp_service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Lunt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: a tiny TCP service with automated client lifecycle
|
14
14
|
email: jefflunt@gmail.com
|
@@ -36,7 +36,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: '0'
|
38
38
|
requirements: []
|
39
|
-
rubygems_version: 3.
|
39
|
+
rubygems_version: 3.4.1
|
40
40
|
signing_key:
|
41
41
|
specification_version: 4
|
42
42
|
summary: a tiny TCP service with automated client lifecycle
|