redpack-ruby 0.1.0 → 0.2.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.
data/TODOs.txt CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
  * DONE dotted-name dispatcher (obj.method...)
6
6
 
7
- * TODO async-call
7
+ * DONE async-call
8
8
 
9
- * TODO fiber? em? based server request-handling?
9
+ * DONE fiber? em? based server request-handling?
10
10
 
11
- * TODO client-timeout?
11
+ * DONE client-timeout?
12
12
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -6,7 +6,7 @@ require 'bundler/setup'
6
6
  Bundler.require(:default)
7
7
 
8
8
 
9
-
9
+ require 'redpack-ruby/integer-minmax'
10
10
  require 'redpack-ruby/consts'
11
11
  require 'redpack-ruby/request-context'
12
12
  require 'redpack-ruby/method-dispatchers'
@@ -1,7 +1,48 @@
1
1
 
2
2
 
3
+
4
+
5
+
3
6
  module RedPack
4
7
 
8
+ class ResponseQueueNameGenerator
9
+
10
+ SESSION_ID_KEY = 'redpack_response_queue_index'
11
+
12
+ def incr_queue_id
13
+ return @redis.incr(SESSION_ID_KEY)
14
+ end
15
+
16
+
17
+ attr_accessor :session_id, :msg_id, :redis
18
+
19
+ def initialize(redis, session_id=nil, msg_id=nil)
20
+ @redis = redis
21
+ @session_id, @msg_id = session_id, msg_id
22
+ end
23
+
24
+ def new_name
25
+ return "redpack-return-#{self.incr_queue_id}"
26
+ end
27
+ end
28
+
29
+ class MsgIdGenerator
30
+ attr_accessor :cur
31
+
32
+ def initialize(cur=1)
33
+ @cur = cur
34
+ end
35
+
36
+ def next
37
+ if @cur < Integer::MAX then
38
+ @cur = @cur.succ
39
+ else
40
+ @cur = 1
41
+ end
42
+ return @cur
43
+ end
44
+ end
45
+
5
46
  class SimpleSyncClient
6
47
 
7
48
  attr_accessor :timeout
@@ -9,38 +50,34 @@ module RedPack
9
50
  def initialize(redis, name, transcoder, timeout=0)
10
51
  @redis = redis
11
52
  @queue_name = RedPack::Consts::queue_name(name)
12
- @response_queue_name = RedPack::Consts::new_response_queue_name(@redis)
13
53
  @transcoder = transcoder
14
54
  @msg_id_seq = 1
15
55
  @timeout = timeout
56
+ @response_queue_name_generator = ResponseQueueNameGenerator.new(@redis)
57
+ @msg_id_generator = MsgIdGenerator.new
16
58
  end
17
59
 
18
- def new_msg_id
19
- if @msg_id_seq < ((2 << 32) - 2) then
20
- @msg_id_seq = @msg_id_seq.succ
21
- return @msg_id_seq
22
- else
23
- @msg_id_seq = 1
24
- return @msg_id_seq
25
- end
26
- end
27
-
28
-
29
60
  # TODO: forwarding?
30
61
 
31
- # TODO: result-async?
62
+ def call_async(method, *params, &cb)
63
+ Thread.new do
64
+ result = self.call(method, *params)
65
+ cb.call(result)
66
+ end
67
+ end
32
68
 
33
69
  def call(method, *params)
34
- msg_id = self.new_msg_id
70
+ msg_id = @msg_id_generator.next
35
71
  v = [RedPack::Consts::REQUEST, msg_id, method, params]
72
+ return_queue_name = @response_queue_name_generator.new_name
36
73
  packed = @transcoder.pack({'data' => v,
37
- 'return' => @response_queue_name,})
74
+ 'return' => return_queue_name,})
38
75
  @redis.multi
39
76
  @redis.rpush(@queue_name, packed)
40
77
  @redis.exec
41
78
  # TODO: refactor...
42
79
  while true do
43
- popped = @redis.blpop(@response_queue_name, @timeout)
80
+ popped = @redis.blpop(return_queue_name, @timeout)
44
81
  if not popped.nil? then
45
82
  unpacked = @transcoder.unpack(popped[1])
46
83
  datum = unpacked['data']
@@ -11,12 +11,6 @@ module RedPack
11
11
  return "redpack_request_queue:#{name}"
12
12
  end
13
13
 
14
- SESSION_ID_KEY = 'redpack_response_queue_index'
15
-
16
- def self.new_response_queue_name(redis)
17
- return redis.incr(RedPack::Consts::SESSION_ID_KEY)
18
- end
19
-
20
14
  end
21
15
 
22
16
 
@@ -0,0 +1,6 @@
1
+ class Integer
2
+ N_BYTES = [42].pack('i').size
3
+ N_BITS = N_BYTES * 8
4
+ MAX = 2 ** (N_BITS - 2) - 1
5
+ MIN = -MAX - 1
6
+ end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "redpack-ruby"
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["jonghyouk yun"]
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "lib/redpack-ruby.rb",
29
29
  "lib/redpack-ruby/clients.rb",
30
30
  "lib/redpack-ruby/consts.rb",
31
+ "lib/redpack-ruby/integer-minmax.rb",
31
32
  "lib/redpack-ruby/method-dispatchers.rb",
32
33
  "lib/redpack-ruby/method-dispatchers/dotted.rb",
33
34
  "lib/redpack-ruby/method-dispatchers/simple.rb",
@@ -8,5 +8,16 @@ transcoder = RedPack::BsonTransCoder.new
8
8
  client = RedPack::SimpleSyncClient.new(redis, 'echo', transcoder)
9
9
 
10
10
 
11
+ thr = client.call_async('echo', 'hi') do |result|
12
+ puts "async-result: #{result}"
13
+ end
14
+
15
+ p thr
16
+ thr.join
17
+
11
18
  puts client.call('echo', 'hi?')
19
+
12
20
  puts client.notify('echo', 'hi?')
21
+
22
+
23
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redpack-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redis
16
- requirement: &81401090 !ruby/object:Gem::Requirement
16
+ requirement: &71249700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.2.2
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *81401090
24
+ version_requirements: *71249700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bson
27
- requirement: &81399840 !ruby/object:Gem::Requirement
27
+ requirement: &71248560 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *81399840
35
+ version_requirements: *71248560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bson_ext
38
- requirement: &81398610 !ruby/object:Gem::Requirement
38
+ requirement: &71247870 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *81398610
46
+ version_requirements: *71247870
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: shoulda
49
- requirement: &81397940 !ruby/object:Gem::Requirement
49
+ requirement: &71247130 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *81397940
57
+ version_requirements: *71247130
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rdoc
60
- requirement: &81397380 !ruby/object:Gem::Requirement
60
+ requirement: &71245950 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '3.12'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *81397380
68
+ version_requirements: *71245950
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: bundler
71
- requirement: &81396200 !ruby/object:Gem::Requirement
71
+ requirement: &71245240 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.0.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *81396200
79
+ version_requirements: *71245240
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: jeweler
82
- requirement: &81395460 !ruby/object:Gem::Requirement
82
+ requirement: &71244640 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: 1.8.3
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *81395460
90
+ version_requirements: *71244640
91
91
  description: Redis + MsgPack RPC Server, Client Library
92
92
  email: ageldama@gmail.com
93
93
  executables: []
@@ -107,6 +107,7 @@ files:
107
107
  - lib/redpack-ruby.rb
108
108
  - lib/redpack-ruby/clients.rb
109
109
  - lib/redpack-ruby/consts.rb
110
+ - lib/redpack-ruby/integer-minmax.rb
110
111
  - lib/redpack-ruby/method-dispatchers.rb
111
112
  - lib/redpack-ruby/method-dispatchers/dotted.rb
112
113
  - lib/redpack-ruby/method-dispatchers/simple.rb
@@ -137,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
137
138
  version: '0'
138
139
  segments:
139
140
  - 0
140
- hash: -900924625
141
+ hash: -333440895
141
142
  required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  none: false
143
144
  requirements: