activerpc 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/README.md +22 -4
- data/lib/active_rpc/operation.rb +4 -0
- data/lib/active_rpc/rack_server.rb +69 -0
- data/lib/active_rpc/request.rb +3 -0
- data/lib/active_rpc/version.rb +1 -1
- data/lib/active_rpc.rb +1 -1
- data/lib/activerpc.rb +1 -1
- metadata +25 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08b7d8b162f3cba366564c7571b55a1c1f3b772a6f989edf8e70974b49e2b97f'
|
4
|
+
data.tar.gz: 37c2e93c5fdfd169625ed06d53fc027dda638e39c30f5b37dec452607dc27e4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0910eb2988cdff04085a38a805a45587a4fc0e24002d703fdde3a101e41cf16ece5a6149f2bca0f2a96144269d4fa9a2f5b13d78c7a56cd5c509d466556e1eff'
|
7
|
+
data.tar.gz: e9cf2a2059e0888a121d9c18007e933905d531be57e47a876a9c69c1fa087cd2cdef14339aa804adfc2da1f729a54688b9ad06c7fdea3a3ce0941815d5192187
|
data/README.md
CHANGED
@@ -25,12 +25,13 @@ Or install it yourself as:
|
|
25
25
|
$ gem install activerpc
|
26
26
|
```
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
The final step is to add a `mount` directive to your
|
29
|
+
routes file, like so:
|
30
30
|
|
31
31
|
```ruby
|
32
|
-
|
33
|
-
|
32
|
+
Rails.application.routes.draw do
|
33
|
+
# other routes...
|
34
|
+
mount ActiveRpc::Engine => "/rpc"
|
34
35
|
end
|
35
36
|
```
|
36
37
|
|
@@ -94,6 +95,23 @@ ActiveRpc.configure do |config|
|
|
94
95
|
end
|
95
96
|
```
|
96
97
|
|
98
|
+
Alternatively, you can use mixins to extend the functionality to get more
|
99
|
+
control.
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
ActiveRpc::RpcController.send(:include, Module.new do
|
103
|
+
extend ActiveSupport::Concern
|
104
|
+
|
105
|
+
included do
|
106
|
+
around_action do
|
107
|
+
start = Time.now
|
108
|
+
yield
|
109
|
+
puts "took #{Time.now - start}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end)
|
113
|
+
```
|
114
|
+
|
97
115
|
#### Development Mode
|
98
116
|
Please note, in development mode you might have issues with the operation classes
|
99
117
|
being autoloaded. The new bootloader in Rails 6 will solve this, but until then you
|
data/lib/active_rpc/operation.rb
CHANGED
@@ -0,0 +1,69 @@
|
|
1
|
+
module ActiveRpc
|
2
|
+
class RackServer
|
3
|
+
def self.call(env)
|
4
|
+
new(Rack::Request.new(env)).call
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :request
|
8
|
+
|
9
|
+
def initialize(request)
|
10
|
+
@request = request
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
res = nil
|
15
|
+
begin
|
16
|
+
res = case body
|
17
|
+
when Array then body.map(&method(:process_item)).map(&:to_hash)
|
18
|
+
when Hash then process_item(body).to_hash
|
19
|
+
end
|
20
|
+
rescue JSON::ParserError => ex
|
21
|
+
res = ActiveRpc::Response.new do |r|
|
22
|
+
r.error = Errors::ParseError.new(message: ex.to_s)
|
23
|
+
end.to_hash
|
24
|
+
end
|
25
|
+
|
26
|
+
[
|
27
|
+
200,
|
28
|
+
{'Content-Type' => 'application/json'},
|
29
|
+
[JSON.generate(res)]
|
30
|
+
]
|
31
|
+
end
|
32
|
+
|
33
|
+
private def process_item(item)
|
34
|
+
req = ActiveRpc::Request.new(item.slice('id', 'method', 'params'))
|
35
|
+
res = ActiveRpc::Response.from_request(req)
|
36
|
+
ex = nil
|
37
|
+
|
38
|
+
begin
|
39
|
+
raise TypeError, 'invalid JSON-RPC request' unless req.valid?
|
40
|
+
|
41
|
+
executor = ActiveRpc.get_executor(req.method)
|
42
|
+
raise NoMethodError, "undefined operation `#{req.method}'" unless executor
|
43
|
+
|
44
|
+
ex = executor.new(req.params)
|
45
|
+
raise ArgumentError, 'invalid payload' unless ex.valid?
|
46
|
+
res.result = ex.call
|
47
|
+
rescue TypeError => e
|
48
|
+
res.error = Errors::ClientError.new(message: e.to_s)
|
49
|
+
res.error.data = req.errors
|
50
|
+
rescue NoMethodError => e
|
51
|
+
res.error = Errors::NoMethodError.new(message: e.to_s)
|
52
|
+
rescue ArgumentError => e
|
53
|
+
res.error = Errors::ArgumentError.new(message: e.to_s)
|
54
|
+
res.error.data = ex.errors
|
55
|
+
rescue OperationFailure => e
|
56
|
+
res.error = e.rpc_error
|
57
|
+
# todo: handle rpc-level errors
|
58
|
+
rescue => e
|
59
|
+
res.error = Errors::InternalError.new(message: e.to_s)
|
60
|
+
end
|
61
|
+
|
62
|
+
res
|
63
|
+
end
|
64
|
+
|
65
|
+
private def body
|
66
|
+
@body ||= JSON.load(request.body.read)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/active_rpc/request.rb
CHANGED
data/lib/active_rpc/version.rb
CHANGED
data/lib/active_rpc.rb
CHANGED
data/lib/activerpc.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require 'active_rpc'
|
metadata
CHANGED
@@ -1,15 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerpc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Maxwell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.2'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '4.2'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '7.0'
|
13
33
|
- !ruby/object:Gem::Dependency
|
14
34
|
name: rails
|
15
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -20,7 +40,7 @@ dependencies:
|
|
20
40
|
- - "<"
|
21
41
|
- !ruby/object:Gem::Version
|
22
42
|
version: '7.0'
|
23
|
-
type: :
|
43
|
+
type: :development
|
24
44
|
prerelease: false
|
25
45
|
version_requirements: !ruby/object:Gem::Requirement
|
26
46
|
requirements:
|
@@ -67,6 +87,7 @@ files:
|
|
67
87
|
- lib/active_rpc/engine.rb
|
68
88
|
- lib/active_rpc/errors.rb
|
69
89
|
- lib/active_rpc/operation.rb
|
90
|
+
- lib/active_rpc/rack_server.rb
|
70
91
|
- lib/active_rpc/request.rb
|
71
92
|
- lib/active_rpc/response.rb
|
72
93
|
- lib/active_rpc/version.rb
|
@@ -90,8 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
111
|
- !ruby/object:Gem::Version
|
91
112
|
version: '0'
|
92
113
|
requirements: []
|
93
|
-
|
94
|
-
rubygems_version: 2.7.6
|
114
|
+
rubygems_version: 3.0.1
|
95
115
|
signing_key:
|
96
116
|
specification_version: 4
|
97
117
|
summary: JSONRpc 2.0 Server library for Rails
|