tiny_tcp_service 1.2.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/tiny_tcp_service.rb +48 -44
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 705433100d134e1b65ea922d21ced51f6429570bdc86aeaba322765c6e4d0cf3
4
- data.tar.gz: 3ab6c3c0510341c0e3bb26180a6baf0576570c0e96b1f6b12cf0ab4c38357521
3
+ metadata.gz: 9153074bb46f8f6cbf51c4a864bfb2fa2eabb63232669d708e61502c931324dd
4
+ data.tar.gz: 401a36c00244ebecad0a6c8ee3cae185860edac655270d4cf4eb70f39392a097
5
5
  SHA512:
6
- metadata.gz: 35ca44ed886b5d9edca59455d6a88cc8f43904c0a3c139596d5656f47f0d431dcc621f1329d178cea0be775f2caf19f9fe7db5b850edc99ae4d9860a3c5d01b9
7
- data.tar.gz: 8b862c075f947a468ce8c42bc6e2fe0de03eb7e37011bed1da0de6bb2af4ece354a6a37ee6aaa09b5af72380b96e56c9093efaffa8d588e471c97cfac8efb209
6
+ metadata.gz: 77f635cb2880c4578db3c72f0190a47f4939dc1f479fc8583e6f39d3eb84368beb1cf1c1ca2f7d146309cb78b3427084a36e9a4e7ddc8b0e886793a496f5f96c
7
+ data.tar.gz: b7766536ee659434cdaa7d1055611784837baf6fb90f9f8e7675d8d29a519fe8d3df66dc84c8cf035f2b1645abaff63538fc263af429963448db11cc58b3507c
@@ -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 = false
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.puts(@msg_handler&.call(c.gets.chomp))
94
- rescue TinyTCPService::BadClient => e
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.2.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-04 00:00:00.000000000 Z
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.3.7
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