ipc_transit 0.0.2 → 0.0.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.
- data/bin/transitd +1 -0
- data/bin/trlist +1 -0
- data/bin/trrecv +2 -1
- data/bin/trsend +1 -0
- data/bin/trserver +1 -0
- data/lib/ipc_transit/compress.rb +33 -0
- data/lib/ipc_transit/serialize.rb +44 -0
- data/lib/ipc_transit/test.rb +21 -0
- data/lib/ipc_transit.rb +9 -15
- data/test/tc_transit_remote.rb +12 -26
- data/test/tc_transit_simple.rb +2 -10
- data/test/tc_transit_yaml.rb +43 -0
- data/test/tc_transit_zlib.rb +41 -0
- metadata +40 -1
data/bin/transitd
CHANGED
data/bin/trlist
CHANGED
data/bin/trrecv
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
2
3
|
require 'ipc_transit'
|
3
4
|
require 'json'
|
4
5
|
|
@@ -10,6 +11,6 @@ nowait = ARGV[1]
|
|
10
11
|
#puts message
|
11
12
|
|
12
13
|
while ret = IPCTransit.receive('qname' => qname, 'nowait' => 1)
|
13
|
-
puts ret
|
14
|
+
puts JSON.pretty_generate(ret)
|
14
15
|
end
|
15
16
|
|
data/bin/trsend
CHANGED
data/bin/trserver
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'zlib'
|
2
|
+
|
3
|
+
def transit_deflate(args)
|
4
|
+
if args['c'].nil?
|
5
|
+
compression_type = 'none'
|
6
|
+
else
|
7
|
+
compression_type = args['c']
|
8
|
+
end
|
9
|
+
case compression_type
|
10
|
+
when 'none'
|
11
|
+
return args['frozen']
|
12
|
+
when 'zlib'
|
13
|
+
return Zlib::deflate(args['frozen'])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def transit_inflate(args)
|
18
|
+
if args['wire_headers'].nil?
|
19
|
+
compression_type = 'none'
|
20
|
+
else
|
21
|
+
if args['wire_headers']['c'].nil?
|
22
|
+
compression_type = 'none'
|
23
|
+
else
|
24
|
+
compression_type = args['wire_headers']['c']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
case compression_type
|
28
|
+
when 'none'
|
29
|
+
return args['serialized_message']
|
30
|
+
when 'zlib'
|
31
|
+
return Zlib::inflate(args['serialized_message'])
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'json'
|
3
|
+
require 'yaml'
|
4
|
+
require 'ipc_transit/compress'
|
5
|
+
|
6
|
+
def transit_freeze(args)
|
7
|
+
if args['e'].nil?
|
8
|
+
serialize_type = 'json'
|
9
|
+
else
|
10
|
+
serialize_type = args['e']
|
11
|
+
end
|
12
|
+
case serialize_type
|
13
|
+
when 'json'
|
14
|
+
args['frozen'] = args['message'].to_json
|
15
|
+
when 'yaml'
|
16
|
+
args['frozen'] = YAML.dump(args['message'])
|
17
|
+
end
|
18
|
+
return transit_deflate(args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def transit_thaw(args)
|
22
|
+
if args['wire_headers'].nil?
|
23
|
+
serialize_type = 'json'
|
24
|
+
else
|
25
|
+
if args['wire_headers']['e'].nil?
|
26
|
+
serialize_type = 'json'
|
27
|
+
else
|
28
|
+
serialize_type = args['wire_headers']['e']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
begin
|
32
|
+
inflated = transit_inflate(args)
|
33
|
+
rescue Exception => msg
|
34
|
+
puts "transit_thaw exception: #{e}"
|
35
|
+
end
|
36
|
+
case serialize_type
|
37
|
+
when 'json'
|
38
|
+
args['thawed'] = JSON.parse(inflated)
|
39
|
+
when 'yaml'
|
40
|
+
args['thawed'] = YAML.load(inflated)
|
41
|
+
end
|
42
|
+
return args['thawed']
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#kind of ghetto, but I don't have a better way right now
|
2
|
+
def drain_test_queue
|
3
|
+
begin
|
4
|
+
while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
5
|
+
end
|
6
|
+
rescue Exception => msg
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def run_daemon(prog)
|
11
|
+
pid = fork
|
12
|
+
if pid.nil? #child
|
13
|
+
exec "bin/#{prog}"
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
return pid
|
17
|
+
end
|
18
|
+
def kill_daemon(pid)
|
19
|
+
Process.kill(9, pid)
|
20
|
+
end
|
21
|
+
|
data/lib/ipc_transit.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'rubygems'
|
2
2
|
require 'SysVIPC'
|
3
3
|
include SysVIPC
|
4
|
+
require 'ipc_transit/serialize'
|
5
|
+
|
4
6
|
|
5
7
|
##
|
6
8
|
# Fast, brokerless message queueing
|
@@ -89,7 +91,7 @@ class IPCTransit
|
|
89
91
|
self.unpack_data(args)
|
90
92
|
#at this point I need to see if this is a remote transit
|
91
93
|
#if it is, then do not thaw the message proper
|
92
|
-
args['message'] =
|
94
|
+
args['message'] = transit_thaw(args)
|
93
95
|
rescue Exception => msg
|
94
96
|
# puts "Exception: #{msg}"
|
95
97
|
# need to do something smarter with this
|
@@ -184,7 +186,8 @@ class IPCTransit
|
|
184
186
|
end
|
185
187
|
begin
|
186
188
|
self.lock_dir()
|
187
|
-
|
189
|
+
File.umask(0000)
|
190
|
+
file = File.open("/tmp/transit/#{qname}", 'w', 0666)
|
188
191
|
new_qid = get_next_id
|
189
192
|
file.puts("qid=#{new_qid}")
|
190
193
|
file.puts("qname=#{qname}")
|
@@ -199,6 +202,7 @@ class IPCTransit
|
|
199
202
|
end
|
200
203
|
|
201
204
|
def self.lock_dir()
|
205
|
+
File.umask(0000)
|
202
206
|
File.open('/tmp/transit.lock', File::WRONLY|File::EXCL|File::CREAT, 0666)
|
203
207
|
end
|
204
208
|
def self.unlock_dir()
|
@@ -209,7 +213,7 @@ class IPCTransit
|
|
209
213
|
self.mk_queue_dir()
|
210
214
|
Dir.glob('/tmp/transit/*').each do |filename|
|
211
215
|
info = {}
|
212
|
-
file = File.new(filename, 'r')
|
216
|
+
file = File.new(filename, 'r', 0666)
|
213
217
|
while (line = file.gets)
|
214
218
|
line.chomp!
|
215
219
|
(key, value) = line.split('=')
|
@@ -234,16 +238,6 @@ class IPCTransit
|
|
234
238
|
end
|
235
239
|
|
236
240
|
|
237
|
-
def self.transit_freeze(args)
|
238
|
-
return args['message'].to_json
|
239
|
-
end
|
240
|
-
|
241
|
-
def self.transit_thaw(args)
|
242
|
-
return JSON.parse(args['serialized_message'])
|
243
|
-
end
|
244
|
-
|
245
|
-
|
246
|
-
|
247
241
|
#returns a scalar, ready to be sent on the wire
|
248
242
|
#it takes message and wire_meta_data
|
249
243
|
def self.pack_message(args)
|
@@ -253,7 +247,7 @@ class IPCTransit
|
|
253
247
|
next if @@ipc_transit_std_args[k]
|
254
248
|
args['message']['.ipc_transit_meta'][k] = args[k]
|
255
249
|
end
|
256
|
-
args['serialized_message'] =
|
250
|
+
args['serialized_message'] = transit_freeze(args)
|
257
251
|
self.serialize_wire_meta(args)
|
258
252
|
l = args['serialized_wire_meta_data'].length
|
259
253
|
args['serialized_wire_data'] = "#{l}:#{args['serialized_wire_meta_data']}#{args['serialized_message']}"
|
data/test/tc_transit_remote.rb
CHANGED
@@ -1,28 +1,15 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'ipc_transit'
|
3
|
+
require 'ipc_transit/test'
|
3
4
|
|
4
|
-
|
5
|
-
def
|
6
|
-
|
7
|
-
|
5
|
+
class TestIPCTransit < Test::Unit::TestCase
|
6
|
+
def teardown
|
7
|
+
if not @transitd_pid.nil?
|
8
|
+
kill_daemon(@transitd_pid)
|
9
|
+
kill_daemon(@trserver_pid)
|
8
10
|
end
|
9
|
-
rescue Exception => msg
|
10
11
|
end
|
11
|
-
end
|
12
12
|
|
13
|
-
def run_daemon(prog)
|
14
|
-
pid = fork
|
15
|
-
if pid.nil? #child
|
16
|
-
exec "bin/#{prog}"
|
17
|
-
exit
|
18
|
-
end
|
19
|
-
return pid
|
20
|
-
end
|
21
|
-
def kill_daemon(pid)
|
22
|
-
Process.kill(9, pid)
|
23
|
-
end
|
24
|
-
|
25
|
-
class TestIPCTransit < Test::Unit::TestCase
|
26
13
|
def test_basic_remote
|
27
14
|
drain_test_queue()
|
28
15
|
IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'd' => '127.0.0.1')
|
@@ -34,18 +21,17 @@ class TestIPCTransit < Test::Unit::TestCase
|
|
34
21
|
def test_full_remote
|
35
22
|
drain_test_queue()
|
36
23
|
begin
|
37
|
-
trserver_pid = run_daemon('trserver')
|
38
|
-
transitd_pid = run_daemon('transitd')
|
39
|
-
sleep
|
24
|
+
@trserver_pid = run_daemon('trserver')
|
25
|
+
@transitd_pid = run_daemon('transitd')
|
26
|
+
sleep 2
|
40
27
|
IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'd' => '127.0.0.1')
|
28
|
+
sleep 2
|
41
29
|
ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
42
|
-
assert(ret, 'IPCTransit.receive returned true')
|
43
|
-
assert_equal(ret['foo'], 'bar')
|
44
30
|
rescue Exception => msg
|
45
31
|
puts "Exception: #{msg}"
|
46
32
|
end
|
47
|
-
|
48
|
-
|
33
|
+
assert(ret, 'IPCTransit.receive returned true')
|
34
|
+
assert_equal(ret['foo'], 'bar')
|
49
35
|
end
|
50
36
|
end
|
51
37
|
|
data/test/tc_transit_simple.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'ipc_transit'
|
3
|
-
|
4
|
-
#kind of ghetto, but I don't have a better way right now
|
5
|
-
def drain_test_queue
|
6
|
-
begin
|
7
|
-
while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
8
|
-
end
|
9
|
-
rescue Exception => msg
|
10
|
-
end
|
11
|
-
end
|
3
|
+
require 'ipc_transit/test'
|
12
4
|
|
13
5
|
class TestIPCTransit < Test::Unit::TestCase
|
14
6
|
def test_typical
|
@@ -36,7 +28,7 @@ class TestIPCTransit < Test::Unit::TestCase
|
|
36
28
|
'c' => 'none',
|
37
29
|
'something' => 'else',
|
38
30
|
'x' => { 'this' => 'that' },
|
39
|
-
'once' => ['more',2]
|
31
|
+
'once' => ['more',2]
|
40
32
|
)
|
41
33
|
ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
42
34
|
assert(ret, 'IPCTransit.receive returned true')
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'ipc_transit'
|
3
|
+
require 'ipc_transit/test'
|
4
|
+
|
5
|
+
class TestIPCTransit < Test::Unit::TestCase
|
6
|
+
def test_yaml_typical
|
7
|
+
drain_test_queue()
|
8
|
+
IPCTransit.send('message' => { 'foo' => 'bar' }, 'e' => 'yaml', 'qname' => 'test_qname')
|
9
|
+
ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
10
|
+
assert(ret, 'IPCTransit.receive returned true')
|
11
|
+
assert_equal(ret['foo'], 'bar')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_yaml_wire_raw
|
15
|
+
drain_test_queue()
|
16
|
+
IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'e' => 'yaml', 'c' => 'none')
|
17
|
+
ret = IPCTransit.receive('qname' => 'test_qname', 'raw' => 1, 'nowait' => 1)
|
18
|
+
assert(ret, 'IPCTransit.receive returned true')
|
19
|
+
assert(ret['serialized_message'] =~ /^---/, 'data verified as YAML')
|
20
|
+
assert_equal(ret['message']['foo'], 'bar')
|
21
|
+
assert_equal(ret['wire_headers']['e'], 'yaml')
|
22
|
+
assert_equal(ret['wire_headers']['c'], 'none')
|
23
|
+
end
|
24
|
+
def test_yaml_message_meta
|
25
|
+
drain_test_queue()
|
26
|
+
IPCTransit.send( 'qname' => 'test_qname',
|
27
|
+
'message' => { 'foo' => 'bar' },
|
28
|
+
'e' => 'json',
|
29
|
+
'c' => 'none',
|
30
|
+
'something' => 'else',
|
31
|
+
'x' => { 'this' => 'that' },
|
32
|
+
'once' => ['more',2]
|
33
|
+
)
|
34
|
+
ret = IPCTransit.receive('qname' => 'test_qname', 'e' => 'yaml', 'nowait' => 1)
|
35
|
+
assert(ret, 'IPCTransit.receive returned true')
|
36
|
+
assert_equal(ret['foo'], 'bar')
|
37
|
+
assert_equal(ret['.ipc_transit_meta']['something'], 'else')
|
38
|
+
assert_equal(ret['.ipc_transit_meta']['x']['this'], 'that')
|
39
|
+
assert_equal(ret['.ipc_transit_meta']['once'][0], 'more')
|
40
|
+
assert_equal(ret['.ipc_transit_meta']['once'][1], 2)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'ipc_transit'
|
3
|
+
require 'ipc_transit/test'
|
4
|
+
|
5
|
+
class TestIPCTransit < Test::Unit::TestCase
|
6
|
+
def test_zlib_typical
|
7
|
+
drain_test_queue()
|
8
|
+
IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'c' => 'zlib', 'e' => 'json')
|
9
|
+
ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
10
|
+
assert(ret, 'IPCTransit.receive returned true')
|
11
|
+
assert_equal(ret['foo'], 'bar')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_zlib_wire_raw
|
15
|
+
drain_test_queue()
|
16
|
+
IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'c' => 'zlib')
|
17
|
+
ret = IPCTransit.receive('qname' => 'test_qname', 'raw' => 1, 'nowait' => 1)
|
18
|
+
assert(ret, 'IPCTransit.receive returned true')
|
19
|
+
assert_equal(ret['message']['foo'], 'bar')
|
20
|
+
assert_equal(ret['wire_headers']['c'], 'zlib')
|
21
|
+
end
|
22
|
+
def test_zlib_message_meta
|
23
|
+
drain_test_queue()
|
24
|
+
IPCTransit.send( 'qname' => 'test_qname',
|
25
|
+
'message' => { 'foo' => 'bar' },
|
26
|
+
'e' => 'json',
|
27
|
+
'c' => 'zlib',
|
28
|
+
'something' => 'else',
|
29
|
+
'x' => { 'this' => 'that' },
|
30
|
+
'once' => ['more',2]
|
31
|
+
)
|
32
|
+
ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
|
33
|
+
assert(ret, 'IPCTransit.receive returned true')
|
34
|
+
assert_equal(ret['foo'], 'bar')
|
35
|
+
assert_equal(ret['.ipc_transit_meta']['something'], 'else')
|
36
|
+
assert_equal(ret['.ipc_transit_meta']['x']['this'], 'that')
|
37
|
+
assert_equal(ret['.ipc_transit_meta']['once'][0], 'more')
|
38
|
+
assert_equal(ret['.ipc_transit_meta']['once'][1], 2)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ipc_transit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: yaml
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: zlib
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
30
62
|
- !ruby/object:Gem::Dependency
|
31
63
|
name: SysVIPC
|
32
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,6 +88,9 @@ extra_rdoc_files: []
|
|
56
88
|
files:
|
57
89
|
- Rakefile
|
58
90
|
- lib/ipc_transit.rb
|
91
|
+
- lib/ipc_transit/test.rb
|
92
|
+
- lib/ipc_transit/serialize.rb
|
93
|
+
- lib/ipc_transit/compress.rb
|
59
94
|
- bin/trrecv
|
60
95
|
- bin/trsend
|
61
96
|
- bin/trlist
|
@@ -63,6 +98,8 @@ files:
|
|
63
98
|
- bin/trserver
|
64
99
|
- test/tc_transit_simple.rb
|
65
100
|
- test/tc_transit_remote.rb
|
101
|
+
- test/tc_transit_yaml.rb
|
102
|
+
- test/tc_transit_zlib.rb
|
66
103
|
homepage: http://rubygems.org/gems/ipc_transit
|
67
104
|
licenses: []
|
68
105
|
post_install_message:
|
@@ -90,3 +127,5 @@ summary: Brokerless, cross-language, fast message queue library
|
|
90
127
|
test_files:
|
91
128
|
- test/tc_transit_simple.rb
|
92
129
|
- test/tc_transit_remote.rb
|
130
|
+
- test/tc_transit_yaml.rb
|
131
|
+
- test/tc_transit_zlib.rb
|