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.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +10 -0
  3. data/LICENSE +24 -0
  4. data/dizby.gemspec +27 -0
  5. data/lib/dizby.rb +12 -0
  6. data/lib/dizby/access/control_list.rb +78 -0
  7. data/lib/dizby/access/entry.rb +61 -0
  8. data/lib/dizby/access/insecure.rb +30 -0
  9. data/lib/dizby/access/list.rb +10 -0
  10. data/lib/dizby/converter/simple.rb +12 -0
  11. data/lib/dizby/converter/timed.rb +23 -0
  12. data/lib/dizby/distributed/array.rb +30 -0
  13. data/lib/dizby/distributed/object.rb +44 -0
  14. data/lib/dizby/distributed/proxy.rb +41 -0
  15. data/lib/dizby/distributed/semi_proxy.rb +26 -0
  16. data/lib/dizby/distributed/undumpable.rb +8 -0
  17. data/lib/dizby/distributed/unknown.rb +57 -0
  18. data/lib/dizby/error.rb +29 -0
  19. data/lib/dizby/protocol/basic.rb +31 -0
  20. data/lib/dizby/protocol/manager.rb +62 -0
  21. data/lib/dizby/protocol/refined.rb +23 -0
  22. data/lib/dizby/protocols/dead.rb +24 -0
  23. data/lib/dizby/protocols/secure.rb +87 -0
  24. data/lib/dizby/protocols/tcp.rb +98 -0
  25. data/lib/dizby/protocols/unix.rb +95 -0
  26. data/lib/dizby/server/abstract.rb +42 -0
  27. data/lib/dizby/server/basic.rb +101 -0
  28. data/lib/dizby/server/registration.rb +23 -0
  29. data/lib/dizby/service.rb +64 -0
  30. data/lib/dizby/stream/client.rb +26 -0
  31. data/lib/dizby/stream/connection.rb +63 -0
  32. data/lib/dizby/stream/messenger.rb +28 -0
  33. data/lib/dizby/stream/query_ref.rb +13 -0
  34. data/lib/dizby/stream/readable.rb +65 -0
  35. data/lib/dizby/stream/writable.rb +37 -0
  36. data/lib/dizby/tunnel/abstract.rb +52 -0
  37. data/lib/dizby/tunnel/basic.rb +21 -0
  38. data/lib/dizby/tunnel/basic_spawn.rb +50 -0
  39. data/lib/dizby/tunnel/bidirectional_strategy.rb +29 -0
  40. data/lib/dizby/tunnel/factory.rb +29 -0
  41. data/lib/dizby/tunnel/local_strategy.rb +24 -0
  42. data/lib/dizby/tunnel/spawn_command.rb +49 -0
  43. data/lib/dizby/tunnel/spawned.rb +43 -0
  44. data/lib/dizby/tunnel/tunnelable_local.rb +8 -0
  45. data/lib/dizby/tunnel/tunnelable_remote.rb +21 -0
  46. data/lib/dizby/utility/classic_access.rb +25 -0
  47. data/lib/dizby/utility/configurable.rb +25 -0
  48. data/lib/dizby/utility/delegator.rb +28 -0
  49. data/lib/dizby/utility/io_barrier.rb +18 -0
  50. data/lib/dizby/utility/log.rb +23 -0
  51. data/lib/dizby/utility/monitor.rb +9 -0
  52. data/lib/dizby/utility/polymorphic_delegated.rb +58 -0
  53. data/lib/dizby/utility/self_pipe.rb +12 -0
  54. data/lib/dizby/utility/semi_built.rb +17 -0
  55. data/lib/dizby/utility/string.rb +8 -0
  56. data/lib/dizby/utility/timed_collection.rb +39 -0
  57. data/lib/dizby/utility/timed_state.rb +41 -0
  58. data/lib/dizby/version.rb +4 -0
  59. data/lib/dizby/worker/connection.rb +44 -0
  60. data/lib/dizby/worker/invoke_method.rb +55 -0
  61. data/lib/dizby/worker/server.rb +39 -0
  62. metadata +146 -0
@@ -0,0 +1,9 @@
1
+
2
+ require 'monitor'
3
+
4
+ module Dizby
5
+ def self.monitor(obj)
6
+ obj.extend(MonitorMixin)
7
+ obj
8
+ end
9
+ end
@@ -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,12 @@
1
+
2
+ module Dizby
3
+ SelfPipe = Struct.new(:read, :write) do
4
+ def close_read
5
+ read.close if read && !read.closed?
6
+ end
7
+
8
+ def close_write
9
+ write.close if write && !write.closed?
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+
2
+ module Dizby
3
+ class SemibuiltObject
4
+ def initialize(klass, *args)
5
+ @klass = klass
6
+ @base_args = args
7
+ end
8
+
9
+ def with(*args, &block)
10
+ @klass.new(*@base_args, *args, &block)
11
+ end
12
+
13
+ def done
14
+ with
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+
2
+ module Dizby
3
+ def self.any_to_s(obj)
4
+ "#{obj}:#{obj.class}"
5
+ rescue
6
+ format '#<%s:0x%1x>', obj.class, obj.__id__
7
+ end
8
+ 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,4 @@
1
+
2
+ module Dizby
3
+ VERSION = '1.3.0'
4
+ 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: []