plux 0.1.2 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a48ed6a3720e61c2bce1d3b181f93b2b8c290019c7feb076ca2398a4c0b6f203
4
- data.tar.gz: 67d7f993aeba391f3986e284c38846e5bc4afb3305b475e390969c3f3dca5c09
3
+ metadata.gz: 472f8a38bccdb6c63b10b4291c4cd109598e8819222c4061dd673f3491d58344
4
+ data.tar.gz: 489ce27db397a3df71058642b8f3dab80ac255cf1ace82f66c12d80980de4efc
5
5
  SHA512:
6
- metadata.gz: 10539dd311f59a391218943e159d389b99033239136f6aeb04137f39e3d563c5fb5af287d907a708bb1f4cbbfec942e3a1e4d053c64e92147f91ca121b3c1559
7
- data.tar.gz: eab024ca828276eebc07118249bd7d9493dde24988f14bd7df71f367d865a5a7580fdc7dc5fdd97e6ee119b56d9cb43f98f9bd81ce0dd58cd74932719c46bed9
6
+ metadata.gz: 565721905d9e193557d56c78a323f35bd41e1650bb7592607534a6da3cf9f961d66801b2a169477f9b3b2019f06d45e1e08bcda6b146d855d5018b11ba5a6231
7
+ data.tar.gz: 32d1c59b0a5b169e9ed33302d576dc3d87e42ba376d9f927f61a34d1f5b8bcdf44582fe11a547de0d62c1827158248dfb6293df8fd06cdaa5716f23bcb313741
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- plux (0.1.0)
4
+ plux (0.1.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -3,6 +3,8 @@ require "socket"
3
3
  require "plux/version"
4
4
  require "plux/server"
5
5
  require "plux/client"
6
+ require "plux/parser"
7
+
6
8
 
7
9
  module Plux
8
10
 
@@ -4,18 +4,17 @@ module Plux
4
4
 
5
5
  def initialize(server_name)
6
6
  @server_name = server_name
7
- UNIXSocket.open(Plux.server_file(server_name)) do |c|
8
- reader, @writer = IO.pipe
9
- c.send_io(reader)
10
- reader.close
11
- end
7
+ @writer = UNIXSocket.open(Plux.server_file(server_name))
12
8
  end
13
9
 
14
- def puts(arg)
15
- @writer.puts(arg)
10
+ def puts(msg)
11
+ Parser.encode(msg).each do |sub_msg|
12
+ @writer.write(sub_msg)
13
+ end
16
14
  end
17
15
 
18
16
  def close
17
+ puts(Parser::LAST_MSG)
19
18
  @writer.close
20
19
  end
21
20
  end
@@ -0,0 +1,67 @@
1
+ module Plux
2
+ class Parser
3
+
4
+ SYSTEM = 36
5
+ SEPERATOR = '.'.freeze
6
+ STREAM_MAX_LEN = 4096
7
+ LAST_MSG = ''.freeze
8
+
9
+ def initialize
10
+ @broken = ''
11
+ end
12
+
13
+ def decode(stream)
14
+ stream = @broken.concat(stream)
15
+ result = []
16
+
17
+ start = 0
18
+ pending = stream.length
19
+
20
+ until start >= pending
21
+ sep_idx = stream.index(SEPERATOR, start)
22
+
23
+ unless sep_idx
24
+ len_str = stream[start, pending]
25
+ @broken.clear
26
+ @broken.concat(len_str)
27
+ return result
28
+ end
29
+
30
+ len_str = stream[start, sep_idx - start]
31
+ est_len = len_str.to_i(SYSTEM)
32
+ start = sep_idx + 1
33
+ msg = stream[start, est_len]
34
+ act_len = msg.length
35
+
36
+ if act_len < est_len
37
+ @broken.clear
38
+ @broken.concat(len_str)
39
+ @broken.concat(SEPERATOR)
40
+ @broken.concat(msg)
41
+ return result
42
+ end
43
+
44
+ result << msg
45
+ start += act_len
46
+ end
47
+
48
+ @broken.clear
49
+ result
50
+ end
51
+
52
+ def self.encode(msg)
53
+ len = msg.length.to_s(SYSTEM)
54
+
55
+ msg = "#{len}#{SEPERATOR}#{msg}"
56
+ len = msg.length
57
+
58
+ return [msg] if len < STREAM_MAX_LEN
59
+
60
+ div, mod = len.divmod(STREAM_MAX_LEN)
61
+ (mod > 0 ? (div + 1) : div).times.map do |start|
62
+ msg[start * STREAM_MAX_LEN, STREAM_MAX_LEN]
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -65,13 +65,24 @@ module Plux
65
65
 
66
66
  class Worker
67
67
  def initialize(socket, worker)
68
+ par = Parser.new
68
69
  t = Thread.new do
69
- client = socket.recv_io
70
- socket.close
71
- while line = client.gets
72
- worker.work(line)
70
+ loop do
71
+ begin
72
+ stream = socket.read_nonblock(Parser::STREAM_MAX_LEN)
73
+ rescue IO::WaitReadable
74
+ IO.select([socket])
75
+ retry
76
+ end
77
+
78
+ msgs = par.decode(stream)
79
+ last_msg = msgs.pop
80
+
81
+ msgs.each{ |msg| worker.work(msg) }
82
+ break if last_msg == Parser::LAST_MSG
83
+ worker.work(last_msg)
73
84
  end
74
- client.close
85
+ socket.close
75
86
  end
76
87
  end
77
88
  end
@@ -1,3 +1,3 @@
1
1
  module Plux
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plux
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ken
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-09 00:00:00.000000000 Z
11
+ date: 2020-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -85,6 +85,7 @@ files:
85
85
  - bin/setup
86
86
  - lib/plux.rb
87
87
  - lib/plux/client.rb
88
+ - lib/plux/parser.rb
88
89
  - lib/plux/server.rb
89
90
  - lib/plux/version.rb
90
91
  - plux.gemspec