jsonrpc2.0 0.1.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/jsonrpc2.0.gemspec +9 -0
- data/lib/jsonrpc2.0/Client.rb +42 -0
- data/lib/jsonrpc2.0/Constants.rb +3 -0
- data/lib/jsonrpc2.0/Errors.rb +40 -0
- data/lib/jsonrpc2.0/Server.rb +64 -0
- data/lib/jsonrpc2.0.rb +2 -0
- metadata +50 -0
data/jsonrpc2.0.gemspec
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'jsonrpc2.0'
|
3
|
+
s.version = '0.1.0'
|
4
|
+
s.date = '2011-06-06'
|
5
|
+
s.summary = 'A server and client implementation of the JsonRpc 2.0 protocol.'
|
6
|
+
s.authors = ['Jannik Theiß']
|
7
|
+
s.files = ['jsonrpc2.0.gemspec', 'lib/jsonrpc2.0.rb', 'lib/jsonrpc2.0/Client.rb', 'lib/jsonrpc2.0/Constants.rb', 'lib/jsonrpc2.0/Errors.rb', 'lib/jsonrpc2.0/Server.rb']
|
8
|
+
s.required_ruby_version = '>= 1.9.2'
|
9
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './Constants.rb'
|
3
|
+
require_relative './Errors.rb'
|
4
|
+
|
5
|
+
class JsonRpcClient
|
6
|
+
include JsonRpcConstants
|
7
|
+
include JsonRpcErrors
|
8
|
+
|
9
|
+
def method_missing(inMethod, *inParams)
|
10
|
+
if (inMethod.to_s[(0..1)] == 'r_')
|
11
|
+
fire_request(inMethod.to_s[(2..-1)].to_sym, *inParams)
|
12
|
+
else
|
13
|
+
raise(NameError, inMethod.to_s, caller)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def fire_request(inMethod, *inParams)
|
18
|
+
request = create_message(inMethod, *inParams)
|
19
|
+
request['id'] = (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
|
20
|
+
|
21
|
+
response = send_request request.to_json
|
22
|
+
response = JSON.parse response
|
23
|
+
|
24
|
+
raise error_from_hash(response['error']) if response.key?('error')
|
25
|
+
|
26
|
+
result = response['result']
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
def fire_notification(inMethod, *inParams)
|
31
|
+
send_notification create_message(inMethod, *inParams).to_json
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_message(inMethod, *inParams)
|
36
|
+
message = {}
|
37
|
+
message['jsonrpc'] = VERSION
|
38
|
+
message['method'] = inMethod
|
39
|
+
message['params'] = inParams if !inParams.empty?
|
40
|
+
message
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module JsonRpcErrors
|
4
|
+
ERRORS = {'ParseError' => -32700, 'InvalidRequest' => -32600, 'MethodNotFound' => -32601, 'InvalidParams' => -32602, 'InternalError' => -32603}
|
5
|
+
|
6
|
+
class Error < StandardError
|
7
|
+
CODE = nil
|
8
|
+
|
9
|
+
attr_reader :data
|
10
|
+
|
11
|
+
def code
|
12
|
+
self.class::CODE
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(message = "", data = nil)
|
16
|
+
super message
|
17
|
+
@data = data
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json(*a)
|
21
|
+
error = {}
|
22
|
+
error['code'] = code
|
23
|
+
error['message'] = message
|
24
|
+
error['data'] = data if !(data == nil)
|
25
|
+
error.to_json(*a)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def error_from_hash(inHash)
|
30
|
+
c = self.class.const_get ERRORS.key(inHash['code'])
|
31
|
+
c.new(inHash['message'], inHash['data'])
|
32
|
+
end
|
33
|
+
|
34
|
+
ERRORS.each do |className, errorCode|
|
35
|
+
c = Class::new(Error) do
|
36
|
+
const_set('CODE', errorCode)
|
37
|
+
end
|
38
|
+
const_set(className, c)
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative './Constants.rb'
|
3
|
+
require_relative './Errors.rb'
|
4
|
+
|
5
|
+
class JsonRpcServer
|
6
|
+
include JsonRpcConstants
|
7
|
+
include JsonRpcErrors
|
8
|
+
|
9
|
+
def handle_message(inMessage)
|
10
|
+
begin
|
11
|
+
begin
|
12
|
+
message = JSON.parse inMessage
|
13
|
+
rescue JSON::ParserError => e
|
14
|
+
raise(ParseError, e.message)
|
15
|
+
end
|
16
|
+
|
17
|
+
if message.class == Array
|
18
|
+
response = message.map{ |e| handle_request(e) }.to_json
|
19
|
+
response.compact!
|
20
|
+
else
|
21
|
+
response = handle_request(message).to_json
|
22
|
+
end
|
23
|
+
rescue Error => e
|
24
|
+
id = nil
|
25
|
+
id = message['id'] if (message.class == Hash)
|
26
|
+
error = create_message(id)
|
27
|
+
error['error'] = e
|
28
|
+
response = error.to_json
|
29
|
+
ensure
|
30
|
+
response
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def handle_request(inRequest)
|
35
|
+
raise InvalidRequest if (inRequest.class != Hash)
|
36
|
+
raise InvalidRequest if (inRequest['jsonrpc'] != VERSION)
|
37
|
+
raise InvalidRequest if (!inRequest.key?('method'))
|
38
|
+
|
39
|
+
begin
|
40
|
+
method = method('r_' + inRequest['method'])
|
41
|
+
params = inRequest['params']
|
42
|
+
result = method.call(*params)
|
43
|
+
rescue NameError => e
|
44
|
+
raise(MethodNotFound, e.message)
|
45
|
+
rescue ArgumentError => e
|
46
|
+
raise(InvalidParams, e.message)
|
47
|
+
end
|
48
|
+
|
49
|
+
if inRequest.key?('id')
|
50
|
+
response = create_message(inRequest['id'])
|
51
|
+
response['result'] = result
|
52
|
+
response
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_message(inId = nil)
|
59
|
+
message = {}
|
60
|
+
message['jsonrpc'] = VERSION
|
61
|
+
message['id'] = inId
|
62
|
+
message
|
63
|
+
end
|
64
|
+
end
|
data/lib/jsonrpc2.0.rb
ADDED
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jsonrpc2.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jannik Theiß
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-06-06 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email:
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- jsonrpc2.0.gemspec
|
21
|
+
- lib/jsonrpc2.0.rb
|
22
|
+
- lib/jsonrpc2.0/Client.rb
|
23
|
+
- lib/jsonrpc2.0/Constants.rb
|
24
|
+
- lib/jsonrpc2.0/Errors.rb
|
25
|
+
- lib/jsonrpc2.0/Server.rb
|
26
|
+
homepage:
|
27
|
+
licenses: []
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.9.2
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.5
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: A server and client implementation of the JsonRpc 2.0 protocol.
|
50
|
+
test_files: []
|