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.
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