pipe_rpc 1.1.2 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99ed1d2bae8edbc79139ae6999900d97fd1cf0c1
4
- data.tar.gz: 90e419e139506cd3d5483f35ba23af86bb8ec02e
3
+ metadata.gz: eb0f50e52b37b279be08b1044701ff5dc9fdb53f
4
+ data.tar.gz: 9aa8ac09ca6ad298acba5869c649a707c2d5bf4c
5
5
  SHA512:
6
- metadata.gz: d023b1e46d06a7148cc20e5343c54ccb36536926d41d3bf4631a3a61b05ec0b41a7356b0458ab4d486feb04b081425628e80c918dd23d2343bf1318099765c60
7
- data.tar.gz: 45e7592fd3653564fc44ee02d2d2256e437d0b5047cd49ef03bd0be151f432389f03fa366b1068ad782cb5b83fd6b977c906bee2f9de9c83ea70d86a296f3827
6
+ metadata.gz: 57dd76c93512192edbe0878d59887a09d9177d0db745243bc4549c226e0e9f908fcd72eb1a195dfa0bdc9009e26bd471745abdedceae9d49a84f04a776a8f640
7
+ data.tar.gz: cc9327c2967955c7c82790f919acc1e7ed33f93eb596a91b88e7bc92b149d9f430e646dd15b674fe562b23454818b5c38ed244d4f83082179f777b3f57c2998d
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # PipeRpc
2
2
 
3
- PipeRpc was designed so parent und child processes can call each other's methods. It uses a json protocol similar to JSON-RPC.
3
+ PipeRpc was designed so parent und child processes can call each other's
4
+ methods. It uses a protocol similar to JSON-RPC but serializes the payloads
5
+ with [msgpack](http://msgpack.org/).
4
6
 
5
7
  ## Installation
6
8
 
@@ -0,0 +1,27 @@
1
+ require 'msgpack'
2
+
3
+ # Serialize objects to strings by default
4
+ class Object
5
+ def to_msgpack(packer)
6
+ packer.pack(to_s)
7
+ end
8
+
9
+ def self.from_msgpack(packed)
10
+ packed.unpack('A*').first
11
+ end
12
+ end
13
+
14
+ # Support serialization of symbols
15
+ MessagePack::DefaultFactory.register_type(0x01, Symbol)
16
+
17
+ # For compatibility with the msgpack implementation in mruby
18
+ MessagePack::Error = MessagePack::UnpackError
19
+
20
+ # The msgpack implementation in mruby supports an ext type for classes
21
+ class Class
22
+ alias_method :to_msgpack_ext, :to_msgpack
23
+ end
24
+ class << Class
25
+ alias_method :from_msgpack_ext, :from_msgpack
26
+ end
27
+ MessagePack::DefaultFactory.register_type(0x02, Class)
@@ -1,5 +1,8 @@
1
1
  module PipeRpc
2
2
  class Client < BasicObject
3
+ undef_method :instance_eval unless ::Object.const_defined?(:MRUBY_VERSION)
4
+ undef_method :instance_exec unless ::Object.const_defined?(:MRUBY_VERSION)
5
+
3
6
  def initialize(server = :default, hub)
4
7
  @server = server.to_sym
5
8
  @hub = hub
@@ -9,6 +12,9 @@ module PipeRpc
9
12
  request = Client::Request.new(server: @server, method: method, arguments: args)
10
13
  @hub.requests.evaluate(request)
11
14
  end
15
+ alias __send__ method_missing
16
+ alias send method_missing
17
+ alias public_send method_missing
12
18
 
13
19
  def to_s
14
20
  "<Client:#{@server.to_s}>"
@@ -1,4 +1,5 @@
1
1
  module PipeRpc
2
+ PipeRpcErrorResponse = ErrorResponse
2
3
  class Hub
3
4
  class Message
4
5
  def initialize(hub, body)
@@ -47,7 +48,7 @@ module PipeRpc
47
48
  def guarded
48
49
  yield
49
50
  rescue => e
50
- @hub.socket.write PipeRpc::ErrorResponse.new(id: @body[:id], error: { code: -32600,
51
+ @hub.socket.write PipeRpcErrorResponse.new(id: @body[:id], error: { code: -32600,
51
52
  data: { message: e.message } })
52
53
  nil
53
54
  end
@@ -1,7 +1,7 @@
1
1
  module PipeRpc
2
2
  class Hub::Request::Result
3
3
  def initialize(request, result)
4
- @request, @result, @async_responder = request, result
4
+ @request, @result = request, result
5
5
  end
6
6
 
7
7
  def value
@@ -10,18 +10,26 @@ module PipeRpc
10
10
 
11
11
  def read
12
12
  raise ClosedError if @input.closed?
13
- incoming = Incoming.new(@input.gets) # blocks
14
- incoming.trigger(@on_received)
15
- incoming.to_h
16
- rescue JSON::JSONError => e
17
- write ErrorResponse.new(id: nil, error: { code: -32700, data: { message: e.message } })
13
+
14
+ # infinite #readpartial that also works with mruby-restricted_io
15
+ packed = ''
16
+ loop do
17
+ packed << @input.sysread(2*16)
18
+ break unless @input.class.select([@input], nil, nil, 0)
19
+ end
20
+
21
+ unpack(packed).tap do |unpacked|
22
+ @on_received.each{ |cb| cb.call(unpacked) }
23
+ end
24
+ rescue MessagePack::Error => e
25
+ write ErrorResponse.new(id: nil, error: { code: -32700, data: { message: "MessagePack: #{e.message}" } })
18
26
  end
19
27
 
20
28
  def write(obj)
21
29
  raise ClosedError if @output.closed?
22
- outgoing = Outgoing.new(obj)
23
- outgoing.trigger(@on_sent)
24
- @output.puts outgoing.to_payload
30
+ payload = obj.to_h
31
+ @on_sent.each{ |callback| callback.call(payload) }
32
+ @output.syswrite payload.to_msgpack
25
33
  end
26
34
 
27
35
  def on_sent(&on_sent)
@@ -36,5 +44,13 @@ module PipeRpc
36
44
  @input.close
37
45
  @output.close
38
46
  end
47
+
48
+ def unpack(packed)
49
+ if ::Object.const_defined?(:MRUBY_VERSION)
50
+ MessagePack.unpack(packed, true) # to create unknown symbols in mruby
51
+ else
52
+ MessagePack.unpack(packed)
53
+ end
54
+ end
39
55
  end
40
56
  end
@@ -1,7 +1,7 @@
1
1
  module PipeRpc
2
2
  class ResultResponse
3
3
  def initialize(args = {})
4
- @result = sanitize(args.fetch(:result))
4
+ @result = args.fetch(:result)
5
5
  @id = args.fetch(:id)
6
6
  end
7
7
 
@@ -10,19 +10,5 @@ module PipeRpc
10
10
  def to_h
11
11
  { id: id, result: result }
12
12
  end
13
-
14
- private
15
-
16
- def sanitize(result)
17
- if true == result or false == result or nil == result or result.is_a?(String) or result.is_a?(Numeric)
18
- result
19
- elsif result.is_a?(Array)
20
- result.map{ |v| sanitize(v) }
21
- elsif result.is_a?(Hash)
22
- Hash[result.map{ |k,v| [sanitize(k), sanitize(v)] }]
23
- else
24
- result.to_s
25
- end
26
- end
27
13
  end
28
14
  end
@@ -1,3 +1,3 @@
1
1
  module PipeRpc
2
- VERSION = "1.1.2"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/pipe_rpc.rb CHANGED
@@ -1,8 +1,4 @@
1
- module PipeRpc
2
- end
3
-
4
- require 'json'
5
- require_relative 'hash'
1
+ require 'msgpack_config'
6
2
 
7
3
  lib = File.dirname(__FILE__)
8
4
  Dir["#{lib}/pipe_rpc/**/*.rb"].sort.each { |f| require f }
data/pipe_rpc.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = %q{RPC between parent and child process over pipes}
13
13
  spec.description = %q{PipeRpc was designed so parent und child processes can call each other's
14
- methods. It uses a json protocol similar to JSON-RPC.}
14
+ methods. It uses a protocol similar to JSON-RPC but serializing with msgpack.}
15
15
  spec.homepage = "https://github.com/christopheraue/ruby-pipe_rpc"
16
16
  spec.license = "MIT"
17
17
 
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_runtime_dependency "json"
22
+ spec.add_runtime_dependency "msgpack", "~> 1.0"
23
23
  spec.add_development_dependency "bundler", "~> 1.8"
24
24
  spec.add_development_dependency "rspec", "~> 3.4"
25
25
  spec.add_development_dependency "rspec-its"
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipe_rpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Aue
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-10 00:00:00.000000000 Z
11
+ date: 2016-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json
14
+ name: msgpack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -82,7 +82,7 @@ dependencies:
82
82
  version: '0.2'
83
83
  description: |-
84
84
  PipeRpc was designed so parent und child processes can call each other's
85
- methods. It uses a json protocol similar to JSON-RPC.
85
+ methods. It uses a protocol similar to JSON-RPC but serializing with msgpack.
86
86
  email:
87
87
  - mail@christopheraue.net
88
88
  executables: []
@@ -96,7 +96,7 @@ files:
96
96
  - Gemfile
97
97
  - README.md
98
98
  - Rakefile
99
- - lib/hash.rb
99
+ - lib/msgpack_config.rb
100
100
  - lib/pipe_rpc.rb
101
101
  - lib/pipe_rpc/client.rb
102
102
  - lib/pipe_rpc/client_request.rb
@@ -118,8 +118,6 @@ files:
118
118
  - lib/pipe_rpc/hub_requests.rb
119
119
  - lib/pipe_rpc/hub_servers.rb
120
120
  - lib/pipe_rpc/hub_socket.rb
121
- - lib/pipe_rpc/hub_socket_incoming.rb
122
- - lib/pipe_rpc/hub_socket_outgoing.rb
123
121
  - lib/pipe_rpc/request.rb
124
122
  - lib/pipe_rpc/result_response.rb
125
123
  - lib/pipe_rpc/version.rb
data/lib/hash.rb DELETED
@@ -1,5 +0,0 @@
1
- class Hash
2
- def symbolize_keys
3
- Hash[self.map{ |k,v| [(k.to_sym rescue k), v] }]
4
- end
5
- end
@@ -1,20 +0,0 @@
1
- module PipeRpc
2
- class Hub::Socket
3
- class Incoming
4
- def initialize(payload)
5
- @payload = payload
6
- end
7
-
8
- def to_h
9
- @hash ||= JSON.load(@payload).symbolize_keys.tap do |hash|
10
- hash[:error] = hash[:error].symbolize_keys if hash[:error]
11
- hash[:error][:data] = hash[:error][:data].symbolize_keys if hash[:error] and hash[:error][:data]
12
- end
13
- end
14
-
15
- def trigger(callbacks)
16
- callbacks.each{ |callback| callback.call(to_h) }
17
- end
18
- end
19
- end
20
- end
@@ -1,21 +0,0 @@
1
- module PipeRpc
2
- class Hub::Socket
3
- class Outgoing
4
- def initialize(object)
5
- @object = object
6
- end
7
-
8
- def to_h
9
- @hash ||= @object.to_h
10
- end
11
-
12
- def to_payload
13
- @payload ||= JSON.dump(to_h)
14
- end
15
-
16
- def trigger(callbacks)
17
- callbacks.each{ |callback| callback.call(to_h) }
18
- end
19
- end
20
- end
21
- end