tiny_tcp_service 1.0.0 → 1.1.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 +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