jsonrpc2.0 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,3 @@
1
+ module JsonRpcConstants
2
+ VERSION = "2.0"
3
+ 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
@@ -0,0 +1,2 @@
1
+ require_relative './jsonrpc2.0/Server.rb'
2
+ require_relative './jsonrpc2.0/Client.rb'
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: []