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.
@@ -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: []