dizby 1.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 +7 -0
- data/.rubocop.yml +10 -0
- data/LICENSE +24 -0
- data/dizby.gemspec +27 -0
- data/lib/dizby.rb +12 -0
- data/lib/dizby/access/control_list.rb +78 -0
- data/lib/dizby/access/entry.rb +61 -0
- data/lib/dizby/access/insecure.rb +30 -0
- data/lib/dizby/access/list.rb +10 -0
- data/lib/dizby/converter/simple.rb +12 -0
- data/lib/dizby/converter/timed.rb +23 -0
- data/lib/dizby/distributed/array.rb +30 -0
- data/lib/dizby/distributed/object.rb +44 -0
- data/lib/dizby/distributed/proxy.rb +41 -0
- data/lib/dizby/distributed/semi_proxy.rb +26 -0
- data/lib/dizby/distributed/undumpable.rb +8 -0
- data/lib/dizby/distributed/unknown.rb +57 -0
- data/lib/dizby/error.rb +29 -0
- data/lib/dizby/protocol/basic.rb +31 -0
- data/lib/dizby/protocol/manager.rb +62 -0
- data/lib/dizby/protocol/refined.rb +23 -0
- data/lib/dizby/protocols/dead.rb +24 -0
- data/lib/dizby/protocols/secure.rb +87 -0
- data/lib/dizby/protocols/tcp.rb +98 -0
- data/lib/dizby/protocols/unix.rb +95 -0
- data/lib/dizby/server/abstract.rb +42 -0
- data/lib/dizby/server/basic.rb +101 -0
- data/lib/dizby/server/registration.rb +23 -0
- data/lib/dizby/service.rb +64 -0
- data/lib/dizby/stream/client.rb +26 -0
- data/lib/dizby/stream/connection.rb +63 -0
- data/lib/dizby/stream/messenger.rb +28 -0
- data/lib/dizby/stream/query_ref.rb +13 -0
- data/lib/dizby/stream/readable.rb +65 -0
- data/lib/dizby/stream/writable.rb +37 -0
- data/lib/dizby/tunnel/abstract.rb +52 -0
- data/lib/dizby/tunnel/basic.rb +21 -0
- data/lib/dizby/tunnel/basic_spawn.rb +50 -0
- data/lib/dizby/tunnel/bidirectional_strategy.rb +29 -0
- data/lib/dizby/tunnel/factory.rb +29 -0
- data/lib/dizby/tunnel/local_strategy.rb +24 -0
- data/lib/dizby/tunnel/spawn_command.rb +49 -0
- data/lib/dizby/tunnel/spawned.rb +43 -0
- data/lib/dizby/tunnel/tunnelable_local.rb +8 -0
- data/lib/dizby/tunnel/tunnelable_remote.rb +21 -0
- data/lib/dizby/utility/classic_access.rb +25 -0
- data/lib/dizby/utility/configurable.rb +25 -0
- data/lib/dizby/utility/delegator.rb +28 -0
- data/lib/dizby/utility/io_barrier.rb +18 -0
- data/lib/dizby/utility/log.rb +23 -0
- data/lib/dizby/utility/monitor.rb +9 -0
- data/lib/dizby/utility/polymorphic_delegated.rb +58 -0
- data/lib/dizby/utility/self_pipe.rb +12 -0
- data/lib/dizby/utility/semi_built.rb +17 -0
- data/lib/dizby/utility/string.rb +8 -0
- data/lib/dizby/utility/timed_collection.rb +39 -0
- data/lib/dizby/utility/timed_state.rb +41 -0
- data/lib/dizby/version.rb +4 -0
- data/lib/dizby/worker/connection.rb +44 -0
- data/lib/dizby/worker/invoke_method.rb +55 -0
- data/lib/dizby/worker/server.rb +39 -0
- metadata +146 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
|
|
2
|
+
require 'dizby/utility/classic_access'
|
|
3
|
+
require 'dizby/utility/delegator'
|
|
4
|
+
|
|
5
|
+
module Dizby
|
|
6
|
+
module PolymorphicDelegated
|
|
7
|
+
def self.included(base)
|
|
8
|
+
base.extend(ClassMethods)
|
|
9
|
+
base.send(:include, InstanceMethods)
|
|
10
|
+
|
|
11
|
+
base.class_eval do
|
|
12
|
+
intercepted = [base, Object, Kernel, BasicObject, InstanceMethods]
|
|
13
|
+
intercepted = intercepted.map(&:instance_methods).inject(&:-)
|
|
14
|
+
|
|
15
|
+
@__delegated_methods__ =
|
|
16
|
+
intercepted.each_with_object({}) do |name, methods|
|
|
17
|
+
methods[name.to_sym] = base.instance_method(name)
|
|
18
|
+
base.send(:undef_method, name)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module ClassMethods
|
|
24
|
+
include ClassicAttributeAccess
|
|
25
|
+
|
|
26
|
+
def __delegated_methods__
|
|
27
|
+
instance_variable_get(:@__delegated_methods__)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def method_added(name)
|
|
31
|
+
return if [:method_missing, :initialize].include?(name)
|
|
32
|
+
@__delegated_methods__[name] = instance_method(name)
|
|
33
|
+
send(:undef_method, name)
|
|
34
|
+
nil
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
module InstanceMethods
|
|
39
|
+
def __delegate__(name, delegator, *args, &block)
|
|
40
|
+
method = self.class.__delegated_methods__[name]
|
|
41
|
+
method_args = [method.defined_in, method.executable, method.name]
|
|
42
|
+
|
|
43
|
+
# NOTE: This only works in Rubinius
|
|
44
|
+
Method.new(delegator, *method_args).call(*args, &block)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def method_missing(name, *args, &block)
|
|
48
|
+
args.unshift(self) if args.empty? || !args.first.is_a?(Delegator)
|
|
49
|
+
|
|
50
|
+
__delegate__ name, *args, &block
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def respond_to?(sym, _priv = false)
|
|
54
|
+
super || self.class.__delegated_methods__.keys.include?(sym)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
require 'dizby/utility/monitor'
|
|
3
|
+
require 'dizby/utility/timed_state'
|
|
4
|
+
|
|
5
|
+
module Dizby
|
|
6
|
+
class InvalidIdentifier < RuntimeError; end
|
|
7
|
+
|
|
8
|
+
class TimedCollection
|
|
9
|
+
def initialize(timeout, step = timeout)
|
|
10
|
+
@timeout = timeout
|
|
11
|
+
@step = [timeout, step].min # don't allow a larger step than timeout
|
|
12
|
+
@states = Dizby.monitor({})
|
|
13
|
+
@updater = Thread.start { update }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def revive(id)
|
|
17
|
+
@states.synchronize { @states.fetch(id).revive }
|
|
18
|
+
rescue KeyError
|
|
19
|
+
raise InvalidIdentifier, 'identifier timed out or did not exist'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add(id)
|
|
23
|
+
@states.synchronize { @states[id] = TimedState.new(@timeout) }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def update
|
|
29
|
+
loop do
|
|
30
|
+
sleep(@step)
|
|
31
|
+
|
|
32
|
+
@states.synchronize do
|
|
33
|
+
@states.each_value(&:update)
|
|
34
|
+
@states.keep_if { |_, state| state.alive? }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
module Dizby
|
|
3
|
+
class TimedState
|
|
4
|
+
def initialize(timeout)
|
|
5
|
+
@timeout = timeout
|
|
6
|
+
revive
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def update
|
|
10
|
+
previous = @last_update
|
|
11
|
+
@last_update = Time.now
|
|
12
|
+
timediff = (@last_update - previous) * 1000
|
|
13
|
+
|
|
14
|
+
@time += timediff
|
|
15
|
+
progress if @time >= @timeout
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def alive?
|
|
19
|
+
@state != :dead
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def revive
|
|
23
|
+
@state = :active
|
|
24
|
+
@time = 0
|
|
25
|
+
@last_update = Time.now
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def progress
|
|
31
|
+
@time = 0
|
|
32
|
+
@state =
|
|
33
|
+
case @state
|
|
34
|
+
when :active
|
|
35
|
+
:inactive
|
|
36
|
+
when :inactive
|
|
37
|
+
:dead
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
|
|
2
|
+
require 'dizby/worker/invoke_method'
|
|
3
|
+
|
|
4
|
+
module Dizby
|
|
5
|
+
class ConnectionWorker
|
|
6
|
+
def initialize(server, conn)
|
|
7
|
+
@server = server
|
|
8
|
+
@conn = conn
|
|
9
|
+
|
|
10
|
+
@thread = Thread.start { process_requests }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def close
|
|
14
|
+
@conn.close unless @conn.closed?
|
|
15
|
+
|
|
16
|
+
# TODO: @thread gets set to nil for some reason...
|
|
17
|
+
@thread.join if @thread
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def process_requests
|
|
23
|
+
loop { break unless process_request }
|
|
24
|
+
rescue RemoteServerShutdown
|
|
25
|
+
@server.log.debug("lost connection to server at #{@conn.remote_uri}")
|
|
26
|
+
ensure
|
|
27
|
+
@conn.close unless @conn.closed?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def process_request
|
|
31
|
+
succ, result = InvokeMethod.new(@server, *@conn.recv_request).perform
|
|
32
|
+
|
|
33
|
+
@server.log.backtrace(result) unless succ
|
|
34
|
+
|
|
35
|
+
begin
|
|
36
|
+
@conn.send_reply(succ, result)
|
|
37
|
+
rescue
|
|
38
|
+
@server.log.backtrace($!)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
succ
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
|
|
2
|
+
require 'dizby/distributed/array'
|
|
3
|
+
|
|
4
|
+
module Dizby
|
|
5
|
+
class InvokeMethod
|
|
6
|
+
def initialize(server, obj, msg, argv, block)
|
|
7
|
+
@obj = obj
|
|
8
|
+
@msg_id = msg.intern
|
|
9
|
+
@argv = argv
|
|
10
|
+
@block = block && proc { |*args| call_block(block, *args) }
|
|
11
|
+
|
|
12
|
+
@server = server
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def perform
|
|
16
|
+
result = send_to_object
|
|
17
|
+
|
|
18
|
+
# TODO: do we care what the @msg_id is?
|
|
19
|
+
# Should we convert to a DistributedArray regardless?
|
|
20
|
+
if @msg_id == :to_ary && result.class == Array
|
|
21
|
+
result = DistributedArray.new(result, @server)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
[true, result]
|
|
25
|
+
rescue StandardError, ScriptError, Interrupt
|
|
26
|
+
@server.log.backtrace($!)
|
|
27
|
+
[false, $!]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def call_block(block, *args)
|
|
33
|
+
if args.size == 1 && args[0].is_a?(Array)
|
|
34
|
+
args[0] = DistributedArray.new(args[0], @server)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
block.call(*args)
|
|
38
|
+
rescue LocalJumpError
|
|
39
|
+
handle_jump_error($!)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def handle_jump_error(err)
|
|
43
|
+
case err.reason
|
|
44
|
+
when :break
|
|
45
|
+
err.exit_value
|
|
46
|
+
else
|
|
47
|
+
fail err
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def send_to_object
|
|
52
|
+
@obj.__send__(@msg_id, *@argv, &@block)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
require 'dizby/worker/connection'
|
|
3
|
+
|
|
4
|
+
module Dizby
|
|
5
|
+
class ServiceWorker
|
|
6
|
+
def initialize(server)
|
|
7
|
+
@server = server
|
|
8
|
+
@thread = Thread.start { run }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def join
|
|
12
|
+
@thread.join if @thread
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def run
|
|
18
|
+
connections = []
|
|
19
|
+
loop do
|
|
20
|
+
conn = accept_connection
|
|
21
|
+
connections << conn if conn
|
|
22
|
+
end
|
|
23
|
+
rescue LocalServerShutdown
|
|
24
|
+
@server.log.debug('Server shutdown')
|
|
25
|
+
ensure
|
|
26
|
+
@server.close if @server.alive?
|
|
27
|
+
|
|
28
|
+
connections.each(&:close)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def accept_connection
|
|
32
|
+
connection = @server.accept
|
|
33
|
+
return nil unless connection
|
|
34
|
+
|
|
35
|
+
@server.add_uri_alias connection.remote_uri
|
|
36
|
+
ConnectionWorker.new(@server, connection)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dizby
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.3.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Nathan Currier
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-12-22 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
type: :runtime
|
|
15
|
+
name: net-ssh
|
|
16
|
+
prerelease: false
|
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
|
18
|
+
requirements:
|
|
19
|
+
- - "~>"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '3.0'
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '3.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
type: :development
|
|
29
|
+
name: rubocop
|
|
30
|
+
prerelease: false
|
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
|
32
|
+
requirements:
|
|
33
|
+
- - "~>"
|
|
34
|
+
- !ruby/object:Gem::Version
|
|
35
|
+
version: '0.35'
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0.35'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
type: :development
|
|
43
|
+
name: reek
|
|
44
|
+
prerelease: false
|
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
|
46
|
+
requirements:
|
|
47
|
+
- - "~>"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: '3.7'
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '3.7'
|
|
55
|
+
description: Distributed Ruby
|
|
56
|
+
email:
|
|
57
|
+
- nathan.currier@gmail.com
|
|
58
|
+
executables: []
|
|
59
|
+
extensions: []
|
|
60
|
+
extra_rdoc_files: []
|
|
61
|
+
files:
|
|
62
|
+
- ".rubocop.yml"
|
|
63
|
+
- LICENSE
|
|
64
|
+
- dizby.gemspec
|
|
65
|
+
- lib/dizby.rb
|
|
66
|
+
- lib/dizby/access/control_list.rb
|
|
67
|
+
- lib/dizby/access/entry.rb
|
|
68
|
+
- lib/dizby/access/insecure.rb
|
|
69
|
+
- lib/dizby/access/list.rb
|
|
70
|
+
- lib/dizby/converter/simple.rb
|
|
71
|
+
- lib/dizby/converter/timed.rb
|
|
72
|
+
- lib/dizby/distributed/array.rb
|
|
73
|
+
- lib/dizby/distributed/object.rb
|
|
74
|
+
- lib/dizby/distributed/proxy.rb
|
|
75
|
+
- lib/dizby/distributed/semi_proxy.rb
|
|
76
|
+
- lib/dizby/distributed/undumpable.rb
|
|
77
|
+
- lib/dizby/distributed/unknown.rb
|
|
78
|
+
- lib/dizby/error.rb
|
|
79
|
+
- lib/dizby/protocol/basic.rb
|
|
80
|
+
- lib/dizby/protocol/manager.rb
|
|
81
|
+
- lib/dizby/protocol/refined.rb
|
|
82
|
+
- lib/dizby/protocols/dead.rb
|
|
83
|
+
- lib/dizby/protocols/secure.rb
|
|
84
|
+
- lib/dizby/protocols/tcp.rb
|
|
85
|
+
- lib/dizby/protocols/unix.rb
|
|
86
|
+
- lib/dizby/server/abstract.rb
|
|
87
|
+
- lib/dizby/server/basic.rb
|
|
88
|
+
- lib/dizby/server/registration.rb
|
|
89
|
+
- lib/dizby/service.rb
|
|
90
|
+
- lib/dizby/stream/client.rb
|
|
91
|
+
- lib/dizby/stream/connection.rb
|
|
92
|
+
- lib/dizby/stream/messenger.rb
|
|
93
|
+
- lib/dizby/stream/query_ref.rb
|
|
94
|
+
- lib/dizby/stream/readable.rb
|
|
95
|
+
- lib/dizby/stream/writable.rb
|
|
96
|
+
- lib/dizby/tunnel/abstract.rb
|
|
97
|
+
- lib/dizby/tunnel/basic.rb
|
|
98
|
+
- lib/dizby/tunnel/basic_spawn.rb
|
|
99
|
+
- lib/dizby/tunnel/bidirectional_strategy.rb
|
|
100
|
+
- lib/dizby/tunnel/factory.rb
|
|
101
|
+
- lib/dizby/tunnel/local_strategy.rb
|
|
102
|
+
- lib/dizby/tunnel/spawn_command.rb
|
|
103
|
+
- lib/dizby/tunnel/spawned.rb
|
|
104
|
+
- lib/dizby/tunnel/tunnelable_local.rb
|
|
105
|
+
- lib/dizby/tunnel/tunnelable_remote.rb
|
|
106
|
+
- lib/dizby/utility/classic_access.rb
|
|
107
|
+
- lib/dizby/utility/configurable.rb
|
|
108
|
+
- lib/dizby/utility/delegator.rb
|
|
109
|
+
- lib/dizby/utility/io_barrier.rb
|
|
110
|
+
- lib/dizby/utility/log.rb
|
|
111
|
+
- lib/dizby/utility/monitor.rb
|
|
112
|
+
- lib/dizby/utility/polymorphic_delegated.rb
|
|
113
|
+
- lib/dizby/utility/self_pipe.rb
|
|
114
|
+
- lib/dizby/utility/semi_built.rb
|
|
115
|
+
- lib/dizby/utility/string.rb
|
|
116
|
+
- lib/dizby/utility/timed_collection.rb
|
|
117
|
+
- lib/dizby/utility/timed_state.rb
|
|
118
|
+
- lib/dizby/version.rb
|
|
119
|
+
- lib/dizby/worker/connection.rb
|
|
120
|
+
- lib/dizby/worker/invoke_method.rb
|
|
121
|
+
- lib/dizby/worker/server.rb
|
|
122
|
+
homepage: https://gem.rideliner.net
|
|
123
|
+
licenses:
|
|
124
|
+
- BSD-3-Clause
|
|
125
|
+
metadata: {}
|
|
126
|
+
post_install_message:
|
|
127
|
+
rdoc_options: []
|
|
128
|
+
require_paths:
|
|
129
|
+
- lib
|
|
130
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - "~>"
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: '2.0'
|
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
|
+
requirements:
|
|
137
|
+
- - ">="
|
|
138
|
+
- !ruby/object:Gem::Version
|
|
139
|
+
version: '0'
|
|
140
|
+
requirements: []
|
|
141
|
+
rubyforge_project:
|
|
142
|
+
rubygems_version: 2.4.8
|
|
143
|
+
signing_key:
|
|
144
|
+
specification_version: 4
|
|
145
|
+
summary: Distributed Ruby
|
|
146
|
+
test_files: []
|