plux 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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