tiny_tcp_service 1.0.0 → 1.1.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 +36 -9
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a9d89a4cf5f6578a0f606fe0c24cb81495fe2c96cfea70074670f2e9a3fd3ac
4
- data.tar.gz: 50b6169a75272e14a07fbd17fc2b6575a3c8010bc580776ad456ee3786eca5bf
3
+ metadata.gz: 1836cd2d7baa8228f9fbfddfe63718aadc35cf26d59e54cbda26c8bea584c2f1
4
+ data.tar.gz: 8e5982655d66d8950d8dafd8239b67dc2977d35dcde6efcd53697adbfe519314
5
5
  SHA512:
6
- metadata.gz: d80e1a3243cb5102bc776d19759c0c5ffed178ccbf7b96aaa895bf18144675be725fc0b7df7f42b877358b980fd9e16d5588a39bc4434bd6f5231c90630d23ae
7
- data.tar.gz: 73fc25a0c4b58609a711694840c3227717412aca82a84623884aa3b1f7539f8e318cb1310913f139dd4114c9010804d7df6ed48ede08450d4c4433156fdb9ece
6
+ metadata.gz: d3f632a782bda92c4f3c83e2ba459a276a073dbd9ea264c54ffd2657428cad420392e76fe5eacff3e80c3f84689aef7a6dbb5167bad98fa24ea76d3389dab401
7
+ data.tar.gz: fcb2d4b300629ae12417d41f98f1e9a30bda1d2ff25e07c6afa4f8d15898ccb1e40019766d2b94597ca9a4f8707f8b90edcc2278d03bcd66e178dfe951547bb7
@@ -8,17 +8,36 @@ require 'socket'
8
8
  #
9
9
  # s.start! # everything runs in background threads
10
10
  # s.stop! # gracefully shutdown the server
11
+ #
12
+ # TinyTCPService implements a line-based, call and response protocol, where
13
+ # every incoming message must be a newline-terminated ("\n") String, and for
14
+ # every received message the service responds with a newline-terminated String.
15
+ # been set).
16
+ #
17
+ # If you need more complex objects to be sent over the wire, consider something
18
+ # like JSON.
19
+ #
20
+ # NOTE: if you're running a TinyTCPService and a client of your system violates
21
+ # your communication protocol, you should raise an instance of
22
+ # TinyTCPService::BadClient, and the TinyTCPService instance will take care of
23
+ # safely removing the client.
11
24
  class TinyTCPService
12
- def initialize(port, msg_handler)
25
+ def initialize(port)
13
26
  @port = port
14
- @msg_handler = msg_handler
15
27
 
16
28
  @server = TCPServer.new(port)
17
29
  @clients = []
18
30
  @running = false
31
+
32
+ @msg_handler = nil
19
33
  @error_handlers = {}
20
34
  end
21
35
 
36
+ # h - some object that responds to #call
37
+ def set_msg_handler!(h)
38
+ @msg_handler = h
39
+ end
40
+
22
41
  # returns true if the server is running
23
42
  # false otherwise
24
43
  def running?
@@ -42,6 +61,11 @@ class TinyTCPService
42
61
  @clients.length
43
62
  end
44
63
 
64
+ def _remove_client!(c)
65
+ @clients.delete(c)
66
+ c.close if c && !c.closed?
67
+ end
68
+
45
69
  # starts the server
46
70
  def start!
47
71
  return if running?
@@ -54,7 +78,7 @@ class TinyTCPService
54
78
  @clients << @server.accept
55
79
  end
56
80
 
57
- @clients.each{|c| c.close if c && !c.closed? }
81
+ @clients.each{|c| _remove_client!(c) if c && !c.closed? }
58
82
  @server.close
59
83
  end
60
84
 
@@ -64,9 +88,11 @@ class TinyTCPService
64
88
  break unless running?
65
89
 
66
90
  readable, _, errored = IO.select(@clients, nil, @clients, 1)
67
- readable&.each do |client|
91
+ readable&.each do |c|
68
92
  begin
69
- @msg_handler.call(client.gets.chomp)
93
+ @msg_handler&.call(c.gets.chomp)
94
+ rescue TinyTCPService::BadClient => e
95
+ _remove_client!(c)
70
96
  rescue => e
71
97
  handler = @error_handlers[e.class]
72
98
 
@@ -74,14 +100,13 @@ class TinyTCPService
74
100
  handler.call(e)
75
101
  else
76
102
  stop!
77
- raise e unless handler
103
+ raise e
78
104
  end
79
105
  end
80
106
  end
81
107
 
82
- errored&.each do |client|
83
- @clients.delete(client)
84
- client.close if client && !client.closed?
108
+ errored&.each do |c|
109
+ _remove_client!(c)
85
110
  end
86
111
  end
87
112
  end
@@ -92,3 +117,5 @@ class TinyTCPService
92
117
  @running = false
93
118
  end
94
119
  end
120
+
121
+ class TinyTCPService::BadClient < RuntimeError; end
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.0.0
4
+ version: 1.1.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-10-29 00:00:00.000000000 Z
11
+ date: 2023-11-04 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