ddp-server-rethinkdb 0.0.2 → 0.0.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
  SHA1:
3
- metadata.gz: 3762c90b25c888a4b99e65b397456dae694fd44a
4
- data.tar.gz: 0c0d33f7dfcf26ba39c4d9e52a681647a304bb29
3
+ metadata.gz: 6388cf68529ae0dd89d4f7ffb09d991ddf3e461e
4
+ data.tar.gz: fa6e9aa686e7776246ae5f22888855a49fa50274
5
5
  SHA512:
6
- metadata.gz: 50f516ea1223ac1f42a469920af571f8681e667966ab656ea4c56f1cbd97968d0fde6ec6a7b207cc1b9f0fca3d0ccb4b8d83ca218a877a286c9bbc1d3bc7d948
7
- data.tar.gz: 812f96b5d42529d100a5629c1f3e570aabdc18f7bd84b8faeb183dac40adc079447b25a65bd19dac1de2336d5f9e0dbd731d70bce2e16fe484ce4b943f71061a
6
+ metadata.gz: e4a140f59e7926c624ed8c367dee381ff2f79a0fe0083e3216c0e4dc799c09b03c1f1b082f906347f71a4589928d7d26e2bdeb4a8e3a2aad74bf671632a7617b
7
+ data.tar.gz: 0afc8680402b614d8c25210802a50995bf7f0f91eabc1ee7d49ba87ac1b5839c911f913c49babda6a6af697b274eff027be2aa99d5a3555431d43f62cb0d2a41
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.6'
22
22
  spec.add_development_dependency 'rake'
23
23
 
24
- spec.add_dependency 'ddp-server', '>= 0.0.3'
24
+ spec.add_dependency 'ddp-server', '>= 0.0.4'
25
25
  spec.add_dependency 'rethinkdb'
26
26
  spec.add_dependency 'connection_pool'
27
27
  end
@@ -1,126 +1,16 @@
1
- require 'ddp/server'
2
- require 'ddp/server/rethinkdb/version'
3
1
  require 'rethinkdb'
4
2
  require 'connection_pool'
3
+ require 'celluloid'
4
+ require 'ddp/server'
5
+ require 'ddp/server/rethinkdb'
6
+ require 'ddp/server/rethinkdb/api'
7
+ require 'ddp/server/rethinkdb/subscription'
8
+ require 'ddp/server/rethinkdb/websocket'
5
9
 
6
10
  module DDP
7
11
  module Server
8
- # A RethinkDB DDP Server
12
+ # A RethinkDB DDP Server implementation
9
13
  module RethinkDB
10
- # Implementation of the WebSocket DDP::Server
11
- class WebSocket < DDP::Server::WebSocket
12
- include Celluloid::Logger
13
-
14
- attr_reader :api
15
-
16
- def self.rack(api, config, pool_config = {})
17
- super(pool_config.merge(args: [api, config]))
18
- end
19
-
20
- def initialize(api_class, config)
21
- collections_module = api_class.const_get :Collections
22
- rpc_module = api_class.const_get :RPC
23
- @collections = collections_module.instance_methods.map(&:to_s)
24
- @rpc_methods = rpc_module.instance_methods.map(&:to_s)
25
- @api = api_class.new(config)
26
- @api.singleton_class.include collections_module
27
- @api.singleton_class.include rpc_module
28
- @subscriptions = {}
29
- end
30
-
31
- def handle_sub(id, name, params)
32
- params ||= []
33
- return send_nosub(id, error: 'No such collection') unless @collections.include? name
34
- query = api.send(name, *params)
35
- @subscriptions[id] = Subscription.new(self, id, name, query)
36
- end
37
-
38
- def subscription_update(id, change)
39
- subscription_name = @subscriptions[id].name
40
- old_value = change['old_val']
41
- new_value = change['new_val']
42
-
43
- return send_added(subscription_name, new_value['id'], new_value) if old_value.nil?
44
- return send_removed(subscription_name, old_value['id']) if new_value.nil?
45
-
46
- cleared = old_value.keys.reject { |key| new_value.include? key }
47
- send_changed(subscription.name, old_value['id'], new_value, cleared)
48
- end
49
-
50
- def handle_unsub(id)
51
- subscription = @subscriptions.delete(id)
52
- subscription.stop unless subscription.nil?
53
- send_nosub(id)
54
- end
55
-
56
- def handle_method(id, method, params)
57
- params ||= []
58
- raise 'No such method' unless @rpc_methods.include? method
59
- result = @api.send(method, *params)
60
- send_result(id, result)
61
- rescue => e
62
- send_error_result(id, e)
63
- end
64
- end
65
-
66
- # Helper class that users can extend to implement an API that can be passed
67
- # as the RPC API parameter to the RethinkDB DDP protocol
68
- class API
69
- def initialize(config)
70
- @connection_pool = ConnectionPool.new(
71
- size: config[:connection_pool_size],
72
- timeout: config[:connection_pool_timeout]
73
- ) do
74
- ::RethinkDB::Connection.new(
75
- host: config[:host],
76
- port: config[:port]
77
- )
78
- end
79
- @database_name = config[:database]
80
- end
81
-
82
- def database
83
- ::RethinkDB::RQL.new.db(@database_name)
84
- end
85
-
86
- def table(name)
87
- database.table(name)
88
- end
89
-
90
- def with_connection
91
- @connection_pool.with do |conn|
92
- yield conn
93
- end
94
- end
95
- end
96
-
97
- # Actor that asynchronously monitors a collection
98
- class Subscription
99
- include Celluloid
100
- include Celluloid::Logger
101
-
102
- attr_reader :name, :stopped
103
- alias_method :stopped?, :stopped
104
-
105
- def initialize(listener, id, name, query)
106
- @stopped = false
107
- @name = name
108
- async.read_loop(listener, query, id)
109
- end
110
-
111
- def read_loop(listener, query, id)
112
- listener.api.with_connection do |conn|
113
- query.changes.run(conn).each do |change|
114
- listener.subscription_update(id, change)
115
- break if stopped?
116
- end
117
- end
118
- end
119
-
120
- def stop
121
- @stopped = true
122
- end
123
- end
124
14
  end
125
15
  end
126
16
  end
@@ -0,0 +1,75 @@
1
+ module DDP
2
+ module Server
3
+ # A RethinkDB DDP Server implementation
4
+ module RethinkDB
5
+ # Helper class that users can extend to implement an API that can be passed
6
+ # as the RPC API parameter to the RethinkDB DDP protocol
7
+ class API
8
+ attr_accessor :database_name
9
+
10
+ def initialize(config)
11
+ @config = config
12
+ @database_name = config[:database]
13
+
14
+ setup_connection_pool
15
+ setup_rpc
16
+ setup_collections
17
+ end
18
+
19
+ def invoke_rpc(method, *params)
20
+ raise 'No such method' unless @rpc_methods.include? method
21
+ send(method, *params)
22
+ end
23
+
24
+ def collection_query(name, *params)
25
+ raise 'No such collection' unless @collections.include? name
26
+ send(name, *params)
27
+ end
28
+
29
+ def database
30
+ ::RethinkDB::RQL.new.db(@database_name)
31
+ end
32
+
33
+ def table(name)
34
+ database.table(name)
35
+ end
36
+
37
+ def with_connection
38
+ @connection_pool.with do |conn|
39
+ yield conn
40
+ end
41
+ end
42
+
43
+ def new_connection
44
+ ::RethinkDB::Connection.new(
45
+ host: @config[:host],
46
+ port: @config[:port]
47
+ )
48
+ end
49
+
50
+ private
51
+
52
+ def setup_connection_pool
53
+ @connection_pool = ConnectionPool.new(
54
+ size: @config[:connection_pool_size],
55
+ timeout: @config[:connection_pool_timeout]
56
+ ) do
57
+ new_connection
58
+ end
59
+ end
60
+
61
+ def setup_rpc
62
+ rpc_module = self.class.const_get :RPC
63
+ @rpc_methods = rpc_module.instance_methods.map(&:to_s)
64
+ singleton_class.include rpc_module
65
+ end
66
+
67
+ def setup_collections
68
+ collections_module = self.class.const_get :Collections
69
+ @collections = collections_module.instance_methods.map(&:to_s)
70
+ singleton_class.include collections_module
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,30 @@
1
+ module DDP
2
+ module Server
3
+ module RethinkDB
4
+ # Actor that asynchronously monitors a collection
5
+ class Subscription
6
+ include Celluloid
7
+
8
+ attr_reader :name, :stopped
9
+ alias_method :stopped?, :stopped
10
+
11
+ def initialize(listener, id, name, query)
12
+ @stopped = false
13
+ @name = name
14
+ async.read_loop(listener, query, id)
15
+ end
16
+
17
+ def read_loop(listener, query, id)
18
+ query.changes.run(listener.api.new_connection).each do |change|
19
+ listener.subscription_update(id, change)
20
+ break if stopped?
21
+ end
22
+ end
23
+
24
+ def stop
25
+ @stopped = true
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -2,7 +2,7 @@ module DDP
2
2
  module Server
3
3
  # Include the version
4
4
  module RethinkDB
5
- VERSION = '0.0.2'
5
+ VERSION = '0.0.3'
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,53 @@
1
+ module DDP
2
+ module Server
3
+ module RethinkDB
4
+ # Implementation of the WebSocket DDP::Server
5
+ class WebSocket < DDP::Server::WebSocket
6
+ attr_reader :api
7
+
8
+ def self.rack(api, config, pool_config = {})
9
+ super(pool_config.merge(args: [api, config]))
10
+ end
11
+
12
+ def initialize(api_class, config)
13
+ @api = api_class.new(config)
14
+ @subscriptions = {}
15
+ end
16
+
17
+ def handle_sub(id, name, params)
18
+ params ||= []
19
+ query = @api.collection_query(name, *params)
20
+ @subscriptions[id] = Subscription.new(self, id, name, query)
21
+ rescue => e
22
+ send_error_result(id, e)
23
+ end
24
+
25
+ def subscription_update(id, change)
26
+ subscription_name = @subscriptions[id].name
27
+ old_value = change['old_val']
28
+ new_value = change['new_val']
29
+
30
+ return send_added(subscription_name, new_value['id'], new_value) if old_value.nil?
31
+ return send_removed(subscription_name, old_value['id']) if new_value.nil?
32
+
33
+ cleared = old_value.keys.reject { |key| new_value.include? key }
34
+ send_changed(subscription.name, old_value['id'], new_value, cleared)
35
+ end
36
+
37
+ def handle_unsub(id)
38
+ subscription = @subscriptions.delete(id)
39
+ subscription.stop unless subscription.nil?
40
+ send_nosub(id)
41
+ end
42
+
43
+ def handle_method(id, method, params)
44
+ params ||= []
45
+ result = @api.invoke_rpc(method, *params)
46
+ send_result(id, result)
47
+ rescue => e
48
+ send_error_result(id, e)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddp-server-rethinkdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tinco Andringa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-20 00:00:00.000000000 Z
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.0.3
47
+ version: 0.0.4
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.0.3
54
+ version: 0.0.4
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rethinkdb
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -97,7 +97,10 @@ files:
97
97
  - ddp-server-rethinkdb.gemspec
98
98
  - examples/messages.rb
99
99
  - lib/ddp/server/rethinkdb.rb
100
+ - lib/ddp/server/rethinkdb/api.rb
101
+ - lib/ddp/server/rethinkdb/subscription.rb
100
102
  - lib/ddp/server/rethinkdb/version.rb
103
+ - lib/ddp/server/rethinkdb/websocket.rb
101
104
  homepage: https://github.com/d-snp/ruby-ddp-server-rethinkdb
102
105
  licenses:
103
106
  - MIT